如何在rails中向当前URL添加参数
在Rails中,如果在link_to
方法中没有传递路径参数,那么默认使用当前的params
。在Rails 3.2中,这是最优雅的方法来添加或修改URL中的参数:
<%= link_to 'lowest prices', params.merge(sort: 'end_date') %> <%= link_to 'relevance', params.merge(sort: 'default') %>
params
是一个Ruby哈希。使用merge方法可以添加一个键或替换一个键的值。如果将nil
作为键的值传递,则会从哈希中删除该键/值对。
<%= link_to 'relevance', params.merge(sort: nil) %>
引用:
- link_to http://apidock.com/rails/ActionView/Helpers/UrlHelper/link_to
- url_for http://apidock.com/rails/v3.2.13/ActionView/Helpers/UrlHelper/url_for
结合使用active_link_to
Gem,您还可以在筛选器上获得漂亮的活动类。- github.com/comfy/active_link_to
您应该在控制器中更新您的答案,使用强参数和params.permit!
。
在Rails中如何向当前URL添加参数
如果您只需要一个cgi参数并希望保留在同一页上,这非常简单:
<%= link_to "最低价格", :sort => "price_lowest" %>
然而,如果您有多个参数,您需要一些逻辑来保留旧的参数。最好将其提取到一个helper中,但基本上您可以这样做来保留其他参数:
<%= link_to "最低价格", :sort => "price_lowest", :other_param => params[:other] %>
命名路由在这里只有在您需要转到另一个页面时才真正有用。
这会删除现有的参数。我最终得到 - localhost:3000/view?sort=price_lowest - 所有其他先前的参数都丢失了。
你能详细说明一下你的解决方案吗?
正如我在答案中所说的,如果您有超过一个参数,您需要一些逻辑来保留您没有设置的参数。将这样的代码放入helper中绝对是最好的地方。这里是一个(可能有缺陷,写得不好并且未经测试)实现的例子:raw.github.com/gist/e22343babcb76381304c/…
如果您只需要URL,您可以使用url_for params.merge( sort: 'price_lowest' )
不起作用,会丢失所有其他参数
使用params.merge( sort: "price_lowest" )
确实起作用并保留现有的参数。如果您没有看到这个效果,那么您的代码可能出了其他问题。注意:对于Rails 5,您需要使用request.params.merge
。
根据下一个答案,它确实起作用。但是我们正在评论的答案除了提供给link_to
的参数之外,丢失了所有其他参数。
该答案确实是错误的。抱歉,可能是我看答案时眼花了。我以为你在评论我的评论,而不是答案本身。 🙂
如果您需要添加一个class,可以这样做:link_to "最低价格", { sort: "price_lowest" }, class: "button"
在Rails中,有时我们需要在当前URL中添加参数。然而,直接使用params.merge方法会导致URL看起来不太美观。为了解决这个问题,可以使用request.params.merge方法来添加参数。
在Rails 5中,需要使用request.params来替代params来添加参数。具体代码如下:
<%= link_to 'Date', request.params.merge(sort: "end_date") %>
在Rails 5中,使用request.params.merge方法添加参数是推荐的做法,可以避免URL变得丑陋。关于这个问题,可以参考https://github.com/rails/rails/issues/26289,里面提供了解释风险和解决方案的示例。