Подтвердить что ты не робот

Rails 3 routing -: метод удаления: коллекция

Я хочу создать маршрут, позволяющий удалить все shares. RESTful способом было бы использовать глагол DELETE. Как создать маршрутизацию, которая указывает на:

DELETE /shares

Я пробовал на маршрутах:

resources :shares do
  delete :on => :collection
end

Но это дало ошибку, что рельсы не могут превратить nil в символ.

Теперь у меня есть:

resources :shares do
  delete 'delete_all', :on => :collection
end

EDIT: У меня была опечатка в имени действия контроллера, и этот последний способ работает, но выдает URL /shares/delete_all, который не очень RESTful.

Как я могу удалить часть _delete_all_?

4b9b3361

Ответ 1

Что мне не хватает?

match 'shares', :to => 'shares#delete_all', :via => :delete

Дополнительная информация: http://www.engineyard.com/blog/2010/the-lowdown-on-routes-in-rails-3/

<subjective opinion> Это, как правило, плохая идея и запах кода/дизайна. Необходимость удаления всех записей через интерфейс RESTful должна быть действительно за защищенным (проверенным подлинностью) действием и/или действие должно быть ограничено для пользователя каким-то образом.

Ответ 2

Для Rails 3 вы можете сделать это таким образом и иметь хорошие находчивые действия GET/DELETE, указывающие на index и delete_all соответственно:

resources :shares do
  delete :index, on: :collection, action: :delete_all
end

Если вы используете Rails 4, вы можете использовать проблемы DRY для этого и применить его ко многим ресурсам:

concern :deleteallable do
  delete :index, on: :collection, action: :delete_all
end

resources :shares, concerns: :deleteallable
resources :widgets, concerns: :deleteallable

Ответ 3

Правильный путь для вашего случая, в маршрутах:

resources :shares, except: :destroy
resource :share, only: :destroy

Пожалуйста, обратите внимание, что я написал слово ресурс для уничтожения действия

Затем переопределите "destroy" в share_controller:

  def destroy
    respond_to do |format|
      if Share.destroy_all
        format.html { redirect_to root_path, notice: 'Share collection successfully deleted' }
      else
        format.html { redirect_to root_path, notice: 'Share collection cannot be deleted.' }
      end
    end
  end

Ответ 4

Вот способ не REST:

resources :shares do
    collection do
        delete :destroy_all
    end
end

Тогда в вашем контроллере вам понадобится что-то вроде этого:

def destroy_all
    Share.delete_all
end

Тогда это то, что вы хотите сделать:

resources :shares do
    collection do
        delete :index
    end
end

Тогда в вашем контроллере вам понадобится что-то вроде этого:

def index
   if request.method == delete #delete might need to be a string here, I don't know
    Share.delete_all
   else
     @shares = Share.all    
   end 
end

Ответ 5

resources :shares do
    collection do
        delete '/', :to => :delete_all
    end
end

Ответ 6

Там немного более простой синтаксис для этого, который работает в Rails 4.2 по крайней мере:

resources :shares do
  delete on: :collection, action: :destroy_all
end