Ruby 在 Rails 上:link_to 对比 button_to

Ruby on Rails: link_to vs button_to

我在实施方法 link_to 时遇到问题。我的程序使用 link 来调用控制器方法,该方法执行一些逻辑并呈现部分。问题是我无法让 link 调用控制器方法。我尝试使用 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错误说明"Couldn't find Product with '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 而不是 button_to[=16= 中作为 ID 传递的信息]

添加 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

我认为区别在于 link_to 默认使用 GET 方法,而 button_to 使用 POST。所以如果你想要一个不同的方法,指定它

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