使用 link_to 设置参数哈希值而不影响 Rails 中的 url 4

Set params hash value using link_to without affecting url in Rails 4

当我提交表单时,设置了一些参数但没有显示在 url 中。

我想用 link_to 做同样的事情:

<%= link_to((purchase.paid ? 'yes' : 'no'), {action: :index, hidden_id: purchase.id}) %>

生成 url 'http://localhost:3000/purchases?hidden_id=1'. I would like to link to the url 'http://localhost:3000/purchases' 同时仍然设置参数 [:hidden_id] 这样我就可以在控制器中访问它,就好像我提交了一个表单一样。

我的routes.rb文件如下:

root to: 'products#index'
resources :products 
resources :purchases
match ':controller/(:action/(:id))', controller: :shop, via: [:get,:post]

在回答这个问题时,关于这两件事的处理方式有什么不同,我应该知道什么吗?是关于 get vs post 请求还是涉及其他一些我没有掌握的原则?

是的,这与 Get 与 Post 请求有关。

Get请求只能在URL本身发送参数。 post 请求也可以发送到 URL,它在 URL 本身中包含参数,但它也可以发送参数 'under the hood' 可以这么说。

因此,如果您的路由设置为允许它,您可以向 http://localhost:3000/purchases?hidden_id=1 发送 get 或 post 请求,但只有 post 请求可以包含其他参数在幕后。

关于这两者处理方式的差异,您还应该了解其他什么吗?是的。在大多数 Web 框架中,当您在服务器端看到参数时,它们将被拆分为 GET 参数和 POST 参数。 Rails 没有做出这种区分,而是将它们放在同一个参数哈希中。 (我认为这很愚蠢,但无论如何)。

此外,只需在浏览器中输入 URL 并按回车键即可发送获取请求。 post 请求通常只会由用户在网页上提交表单时执行。因此,get 请求并不意味着更改数据库中的任何内容。它们应该仅用于查看信息。因此,例如,如果您有删除资源的按钮(例如博客 post 或其他),则应通过 post 提交。 (更多信息请见 )

最后,Rails 在其 link_to 帮助程序中提供了一个选项,让您可以轻松地让 'link' 使用 post 请求。请参阅 http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to 中的 method 选项。这基本上使用 javascript 来阻止单击 link 的正常操作(这将是一个获取请求),而是提交一个 post 请求。