Ruby on Rails:link_to与button_to

时间:2019-05-23 18:16:14

标签: ruby-on-rails ruby erb

我在实现方法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而不是button_to中将路径作为ID传递的信息

2 个答案:

答案 0 :(得分:2)

添加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标签,而无需使用Rails UJS即可进行正确的POST请求。

检查两个文档: 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

答案 1 :(得分:1)

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

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