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

Как добавить пользовательское действие к контроллеру в Rails 3

Я хочу добавить еще одно действие к моему контроллеру, и я не могу понять, как это сделать.

Я нашел это на RailsCasts и в большинстве тем StackOverflow:

# routes.rb
resources :items, :collection => {:schedule => :post, :save_scheduling => :put}

# items_controller.rb
  ...
  def schedule
  end

  def save_scheduling
  end

# items index view:
<%= link_to 'Schedule', schedule_item_path(item) %>

Но это дает мне ошибку:

undefined method `schedule_item_path' for #<#<Class:0x6287b50>:0x62730c0>

Не знаю, куда мне идти.

4b9b3361

Ответ 1

Хороший способ писать

resources :items, :collection => {:schedule => :post, :save_scheduling => :put}

является

resources :items do
  collection do
    post :schedule
    put :save_scheduling
  end
end

Это создаст URL-адреса, например

  • /items/schedule
  • /items/save_scheduling

Поскольку вы передаете item в свой метод маршрута schedule_..., вам скорее всего нужны маршруты member вместо маршрутов collection.

resources :items do
  member do
    post :schedule
    put :save_scheduling
  end
end

Это создаст URL-адреса, например

  • /items/:id/schedule
  • /items/:id/save_scheduling

Теперь будет доступен метод маршрута schedule_item_path, принимающий экземпляр item. Конечная проблема заключается в том, что ваш link_to в своем роде будет генерировать запрос GET, а не запрос POST по мере необходимости вашего маршрута. Вы должны указать это как опцию :method.

link_to("Title here", schedule_item_path(item), method: :post, ...)

Рекомендуемое чтение: http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to

Ответ 2

Ref Rails Routing from the Outside In

Следующее должно работать

resources :items do
  collection do
    post 'schedule'
    put 'save_scheduling'
  end
end

Ответ 3

Вы можете написать routes.rb следующим образом:

match "items/schedule" => "items#schedule", :via => :post, :as => :schedule_item
match "items/save_scheduling" => "items#save_scheduling", :via => :put, :as => :save_scheduling_item

А хелпер link_to не может отправить глагол post в Rails 3.

Вы можете увидеть Rails Routing from Outside In