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_?
Ответы
Ответ 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