【问题标题】:Difference between path helper and [action, controller] in button_tobutton_to 中路径助手和 [action, controller] 之间的区别
【发布时间】: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


【解决方案1】:

在第一个中,您将 button_ 提供给 route_path 而不是资源特定路径。正确的做法是做

order_shipped_path(@order)

路由需要解析 :id 部分,并且只有在将特定对象传递给它时,助手才能这样做。

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

在第二种情况下,您同时告诉它路线 :shipped 和资源 @order。

【讨论】:

    【解决方案2】:

    通过在资源路由中嵌套PUTshipped 路由,您实际上是在声明shipped 控制器上有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 %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      • 2018-06-17
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多