2013-07-15 57 views
1

我想向控制器添加另一個動作。所以我在我的控制器中定義了這個動作,添加了一個按鈕來激活它並將它添加到routes.rb中。路徑助手和[action,controller]之間的區別button_to

orders_controller.rb

... 
def shipped 
... 
end 
... 

的routes.rb

resources :orders do 
    put :shipped, on: :member 
end 
... 

視圖/命令/ edit.html.rb

... 
<%= button_to 'Ship', order_shipped_path, method: :put %> 
... 

然而,當我試圖查看/命令/ 1 /編輯我得到這個錯誤:

No route matches {:action=>"shipped", :controller=>"orders"} 

耙路線給了我下面的輸出:

shipped_order PUT /orders/:id/shipped(.:format)  orders#shipped 
     orders GET /orders(.:format)     orders#index 
       POST /orders(.:format)     orders#create 
    new_order GET /orders/new(.:format)    orders#new 
    edit_order GET /orders/:id/edit(.:format)   orders#edit 
     order GET /orders/:id(.:format)    orders#show 
       PUT /orders/:id(.:format)    orders#update 
       DELETE /orders/:id(.:format)    orders#destroy 
... 

搜索,試圖找到路徑的助手和路線信息後,我發現下面的替代語法,它的工作:

<%= button_to 'Ship', [:shipped, @order], method: :put %> 

所以問題是,爲什麼替代語法起作用?幕後發生了什麼?另外,這是向路由添加操作的正確方式嗎?

如果是相關的,我使用Ruby on Rails的3.2

感謝

+0

還有第三個答案,但無論誰把它刪除。這也是正確的,我可以通過shipped_order_path得到正確的結果。 –

回答

2

通過您的資源路線內嵌套PUTshipped路線時,實際上是宣告存在Order控制器上的shipped行動。在模型上執行操作,並且就此而言,link_to助手的Rails命名約定是action_controller(例如,new_post_path)。

運行rake routes產生如下:

# rake routes 
shipped_order PUT /orders/:id/shipped(.:format)  orders#shipped 

要調用的路線,你可以利用你正在使用的語法:

<%= button_to 'Ship', [:shipped, @order], method: :put %> 

這句法括號理解:shipped符號是行動,並orders_controller成爲控制器。因此,它構成了使用路徑助手創建的相同路線:

<%= button_to 'Ship', order_shipped_path(@order), method: :put %> 
2

在你給button_to的route_path而不是資源的具體路徑中的第一個。正確的方法是做

order_shipped_path(@order) 

路線需要解決:ID部分和輔助只能這樣做,當特定對象傳遞給它。

shipped_order PUT /orders/:id/shipped(.:format)  orders#shipped 

在你的第二種情況下,你告訴它的路線,發貨和資源@order。

相關問題