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

route メソッドに を渡しているため、ルートではなくルートが必要になる可能性itemがあります。schedule_...membercollection

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を生成することです。オプションで指定する必要があります。GETPOST: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

また、ヘルパーはRails 3 で動詞をlink_to送信できません。post

Rails Routing を Outside In から見ることができます

于 2012-12-07T13:22:34.453 に答える