【发布时间】:2013-07-13 22:51:17
【问题描述】:
我想向控制器添加另一个动作。所以我在控制器中定义了动作,添加了一个按钮来激活它并将它添加到 routes.rb 中。
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 %>
...
但是,当我尝试查看 /orders/1/edit 时出现此错误:
No route matches {:action=>"shipped", :controller=>"orders"}
rake routes 给了我以下输出:
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
谢谢
【问题讨论】:
-
还有第三个答案,但是贴出来的人删了。这也是正确的,我可以通过 shipping_order_path 得到正确的结果。
标签: ruby-on-rails routes