我在实现方法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传递的信息
答案 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 %>