将querystring参数添加到link_to


214

我很难将querystring参数添加到link_to UrlHelper。例如,我有一个Index视图,其中包含用于排序,过滤和分页的UI元素(通过will_paginate)。will_paginate插件可以正确管理querystring参数的页内持久性。

是否有自动机制将querystring参数添加到给定命名路由,还是我需要手动进行?对这个看似简单的结构的大量研究使我毫无头绪。

编辑

一些挑战:

  1. 如果我有两个querystring参数,bucket和sorting,如何在link_to中为其中一个设置特定值,同时保留另一个的当前值?例如:

    <%= link_to "0", profiles_path(:bucket => '0', :sorting=>?? ) %>
  2. 如果我有多个querystring参数,bucket&sorting和page_size,并且要将值设置为其中之一,是否可以“自动”包括其余参数的名称和值?例如:

    <%= link_to "0", profiles_path(:bucket => '0', [include sorting and page_size name/values here] ) %>
  3. will_paginate插件自动管理其页面变量和其他querystring变量。似乎没有用于管理页面大小的自动UI元素。虽然我看到了创建页面大小选择列表的代码,但我宁愿为此使用A元素(例如SO)。此挑战的一部分与#2有关,一部分与基于记录的存在/不存在隐藏/显示此UI元素有关。换句话说,如果有要记录的页面,我只想包括页面大小的链接。而且,我更喜欢自动包括其他QS变量(即页面,存储桶,排序),而不是必须在link_to中按名称包括它们。



Answers:


341

link_to上API文档显示了一些将查询字符串添加到命名路由和旧式路由的示例。这是你想要的吗?

link_to 也可以产生带有锚点或查询字符串的链接:

link_to "Comment wall", profile_path(@profile, :anchor => "wall")
#=> <a href="https://stackoverflow.com/profiles/1#wall">Comment wall</a>

link_to "Ruby on Rails search", :controller => "searches", :query => "ruby on rails"
#=> <a href="https://stackoverflow.com/searches?query=ruby+on+rails">Ruby on Rails search</a>

link_to "Nonsense search", searches_path(:foo => "bar", :baz => "quux")
#=> <a href="https://stackoverflow.com/searches?foo=bar&amp;baz=quux">Nonsense search</a>

1
您的答案帮助我解决了#1:<%= link_to“ 0”,profiles_path(:bucket =>'0',:sorting => params [:sorting])%>。谢谢。
craig 2010年

这是对的。新语法是`<%= link_to“ Create Note”,new_note_path(sender_id:@ user.id)%>`
gsumk

51

如果您想使用快速而肮脏的方式并且不必担心XSS攻击,请使用params.merge保留先前的参数。例如

<%= link_to 'Link', params.merge({:per_page => 20}) %>

参见:https : //stackoverflow.com/a/4174493/445908

否则,请检查以下答案:params.merge和跨站点脚本


56
不要这样做,这会使您容易受到xss攻击。
Daniel Nill 2013年

1
@ DanielNill-您能解释一下吗
Yarin

3
@Yarin 这个问题有一个很好的解释。
詹姆斯

5
@Yarin将参数由用户提交(并不一定要清除)任意打印到页面中,使某人可以使用对Javascript进行编码的链接来链接到您的站点。然后,该Javascript将被打印到页面中并执行,可能会窃取Cookie或执行有害的任务。Rails通常非常擅长于清洁打印在页面中的内容,但是要安全起来总比对不起
Peter Nixey

24

如果您想保留现有的参数而不希望自己遭受XSS攻击,请确保清除参数哈希,仅保留应用程序可以发送的参数:

# inline
<%= link_to 'Link', params.slice(:sort).merge(per_page: 20) %>

 

如果在多个地方使用它,请清洁控制器中的参数:

# your_controller.rb
@params = params.slice(:sort, :per_page)

# view
<%= link_to 'Link', @params.merge(per_page: 20) %>

4

如果您要传递一个块,例如一个glyphicon按钮,如下所示:

<%= link_to my_url, class: "stuff" do %>
  <i class="glyphicon glyphicon-inbox></i> Nice glyph-button
<% end %>

然后,可以通过以下方式传递查询字符串参数:

<%= link_to url_for(params.merge(my_params: "value")), class: "stuff" do %>
  <i class="glyphicon glyphicon-inbox></i> Nice glyph-button
<% end %>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.