如何在rails中为当前URL添加参数

Ved*_*Ved 24 ruby-on-rails

我有一个逻辑,我允许对价格和相关性进行排序.我这样做是通过将参数传递给控制器​​.我的网址有一个参数 - 'sort',它可以有一个值 - 'price_lowest'或'default'.链接看起来像:

<a href="<%= request.fullpath + '&sort=price_lowest' %>">lowest prices</a> | 
<a href="<%= request.fullpath + '&sort=default' %>">relevance</a>
Run Code Online (Sandbox Code Playgroud)

上面代码的问题是它"添加"参数并且不"替换"它们.我想在不添加新值的情况下替换&sort =参数的值.我不想要:

../&sort=price_lowest&sort=price_lowest&sort=default
Run Code Online (Sandbox Code Playgroud)

根据当前的逻辑 - 我得到了上述行为.有什么建议 ?

lul*_*ala 46

为了保留params我做了这个:

__CODE__

然而,网址将是丑陋的.

UPDATE

对于Rails 5使用:

__CODE__

  • 为什么不``<%= link_to'Date',params.merge(:sort =>"end_date")%>`顺便说一下你的名字看起来很有趣,就像中文... (14认同)
  • 在rails 5中,你需要使用request.params <%= link_to'Date',request.params.merge(:sort =>"end_date")%> (6认同)
  • 对于 Rails 5,https://github.com/rails/rails/issues/26289 是一本很好的读物,其中包含风险解释和解决方案示例。 (2认同)

idl*_*ers 29

如果您只需要一个cgi param并希望保持在同一页面上,那么实现起来非常简单:

<%= link_to "lowest prices", :sort => "price_lowest" %>
Run Code Online (Sandbox Code Playgroud)

但是,如果你有多个,你需要一些逻辑来保持旧的.它可能最好被提取给帮助者,但基本上你可以做这样的事情来保留其他参数.

<%= link_to "lowest prices", :sort => "price_lowest", :other_param => params[:other] %>
Run Code Online (Sandbox Code Playgroud)

如果您需要转到其他页面,命名路线只会真正帮助您.

  • 这将删除现有参数.我最终得到了 - http:// localhost:3000/view?sort = price_lowest - 所有其他先前的参数都丢失了. (3认同)

sca*_*er2 13

如果未将路径传递给link_to方法,params则假定为当前路径.在Rails 3.2中,这是在URL中添加或修改参数的最优雅方法:

<%= link_to 'lowest prices', params.merge(sort: 'end_date') %>
<%= link_to 'relevance', params.merge(sort: 'default') %>
Run Code Online (Sandbox Code Playgroud)

params是一个Ruby哈希.使用merge将添加密钥或替换密钥的值.如果您传递nil一个键的值,它将从哈希中删除该键/值对.

<%= link_to 'relevance', params.merge(sort: nil) %>
Run Code Online (Sandbox Code Playgroud)

引用: