23

我想向我的控制器添加另一个动作,但我不知道如何。

我在 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>

不知道我应该从这里去哪里。

4

3 回答 3

51

更好的写作方式

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

于 2012-12-07T13:21:30.020 回答
2

参考Rails Routing from the Outside In

以下应该工作

resources :items do
  collection do
    post 'schedule'
    put 'save_scheduling'
  end
end
于 2012-12-07T13:20:08.380 回答
1

你可以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 路由

于 2012-12-07T13:22:34.453 回答