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

Я хочу создать маршрут, позволяющий удалить все 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_?

12 голосов | спросил Laas 24 Maypm11 2011, 22:54:29

6 ответов


0
  

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

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

подробнее: http: //www.engineyard.com/blog/2010/the-lowdown-on-routes-in-rails-3/

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

ответил colinross 24 Maypm11 2011, 23:12:50
0

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

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

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

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

resources :shares, concerns: :deleteallable
resources :widgets, concerns: :deleteallable
ответил MDahlke 18 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 18 Sep 2013 21:43:18 +0400 2013, 21:43:18
0

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

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

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

Затем переопределите "destroy" в shares_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
ответил Alexey 14 32012vEurope/Moscow11bEurope/MoscowWed, 14 Nov 2012 03:30:24 +0400 2012, 03:30:24
0

Вот не 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
ответил thenengah 24 Maypm11 2011, 23:14:11
0

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

resources :shares do
  delete on: :collection, action: :destroy_all
end
ответил dmccabe 27 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 27 Sep 2016 01:12:33 +0300 2016, 01:12:33
0
resources :shares do
    collection do
        delete '/', :to => :delete_all
    end
end
ответил yevhene 22 Jpm1000000pmTue, 22 Jan 2013 16:19:47 +040013 2013, 16:19:47

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132