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 %>
我在实施方法 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 %>