【问题标题】:Ruby on Rails: link_to vs button_toRuby on Rails:link_to 与 button_to
【发布时间】:2019-05-23 18:16:13
【问题描述】:

我在实现方法 link_to 时遇到问题。我的程序使用链接来调用控制器方法,该方法执行一些逻辑并呈现部分。问题是我无法获得调用控制器方法的链接。我试过用 button_to 调用相同的控制器方法,它似乎工作。查看 ActionView 辅助方法 button_to 和 link_to 的 API,参数似乎应该相同。然而,下面两行代码做了两件不同的事情。

_product.html.erb

<%= link_to 'view individual', products_view_individual_product_page_path(product_id: product.id)%>
<%= button_to 'view individual', products_view_individual_product_page_path(product_id: product.id)%>

link_to 调用将导致错误 ActiveRecord::RecordNotFound 错误指出“找不到具有 'id'=view_individual_product_page 的产品”并且传递的参数是 {"product_id"=>"261", "id"=>" view_individual_product_page"},我不确定为什么它试图将我的控制器方法的路径作为 id 传递。但是 button_to 代码行工作得很好,我在指定的控制器方法中。这是我的 routes.rb 文件中的路由条目...

routes.rb

post 'products/view_individual_product_page'

谁能向我解释我在这里做错了什么,我在网上找不到太多关于为什么路径在 link_to 中作为 ID 而不是 button_to 传递的信息

【问题讨论】:

    标签: ruby-on-rails ruby erb


    【解决方案1】:

    添加method: :post 作为link_to 的选项。

    link_to 'view individual', products_view_individual_product_page_path(product_id: product.id), method: :post
    

    “A”标签总是执行 GET 请求,而您期待 POST 请求。请注意,您需要 Rails Unobtrusive Javascript 链接来触发 POST 请求,Rails 在幕后做了一些魔术(检查您的 javascript application.js,您应该有一个 require rails-ujs)。

    通常,如果您需要执行 POST 请求,则可以使用 button_to,因为它实际上会呈现带有按钮的 FORM 标记来执行正确的 POST 请求,而无需 Rails UJS。

    检查两者的文档: https://api.rubyonrails.org/v5.2.3/classes/ActionView/Helpers/UrlHelper.html#method-i-button_to https://api.rubyonrails.org/v5.2.3/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to

    【讨论】:

    • 我明白了,我尝试添加方法: :post 并且链接有效。不知道他们使用了不同的http方法。感谢您的回答和解释。
    【解决方案2】:

    我认为区别在于link_to 默认使用GET 方法,其中button_to 使用POST。因此,如果您想要不同的方法,请指定它

    <%= link_to 'view individual', products_view_individual_product_page_path(product_id: product.id), method: :post %>
    

    【讨论】:

    • 成功了,非常感谢您的回答和解释!
    • 嘿,别担心,我的荣幸 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多