将查询字符串参数添加到 link_to

Posted

技术标签:

【中文标题】将查询字符串参数添加到 link_to【英文标题】:Add querystring parameters to link_to 【发布时间】:2011-02-11 08:07:32 【问题描述】:

我很难 UrlHelper。例如,我有一个索引视图,其中包含用于排序、过滤和分页的 UI 元素(通过 will_paginate)。 will_paginate 插件正确管理查询字符串参数的页内持久性。

是否有自动机制将查询字符串参数添加到给定的命名路由,还是我需要手动添加?对这个看似简单的结构进行了大量研究,却让我一无所知。

编辑

一些挑战:

    如果我有两个查询字符串参数,存储桶和排序,如何在 link_to 中为其中一个设置特定值,同时保留另一个的当前值?例如:

    <%= link_to "0", profiles_path(:bucket => '0', :sorting=>?? ) %>
    

    如果我有多个查询字符串参数、存储桶和排序和 page_size,并且我想将值设置为其中之一,有没有办法“自动”包含其余参数的名称和值?例如:

    <%= link_to "0", profiles_path(:bucket => '0', [include sorting and page_size name/values here] ) %>
    

    will_paginate 插件自动管理其页面变量和其他查询字符串变量。似乎没有用于管理页面大小的自动 UI 元素。虽然我已经看到了创建页面大小选择列表的代码,但我宁愿为此使用 A 元素(如 SO)。这个挑战的一部分与 #2 有关,部分与基于记录的存在/不存在隐藏/显示此 UI 元素有关。换句话说,如果有要分页的记录,我只想包含页面大小的链接。此外,我更喜欢自动包含其他 QS 变量(即页面、存储桶、排序),而不是在 link_to 中按名称包含它们。

【问题讨论】:

More-efficient way to pass the Rails params hash to named route的可能重复 密切相关:***.com/questions/2124862/… 【参考方案1】:

您可以像这样使用the official rails guides 中提到的data- 属性:

  <%= link_to 'Link', link_path, data:  params: "per_page=20"  %>

params 在控制器中将是:

"per_page"=&gt;"20" etc...

这个例子可以通过params[:per_page]访问

【讨论】:

【参考方案2】:

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

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

见:https://***.com/a/4174493/445908

否则,请检查此答案:params.merge and cross site scripting

【讨论】:

不要这样做,它会让你面临 xss 攻击。 @DanielNill- 你能解释一下 @Yarin this question 有一个很好的解释。 @Yarin 随意将用户提交的参数打印到页面中(不一定要清理),允许某人使用编码 javascript 的链接链接到您的站点。然后将 Javascript 打印到页面中并执行,可能会窃取 cookie 或执行恶意任务。 Rails 通常非常擅长清理打印到页面中的内容,但安全总比抱歉要好【参考方案3】:

如果你想传入一个块,比如一个字形按钮,如下所示:

<%= 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 %>

【讨论】:

【参考方案4】:

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

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

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

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

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

【讨论】:

你的回答帮我解决了#1: '0', :sorting=>params[:sorting]) %>。谢谢。 这是对的。新语法是` `【参考方案5】:

如果您想保留现有参数并且不让自己受到 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) %>

【讨论】:

以上是关于将查询字符串参数添加到 link_to的主要内容,如果未能解决你的问题,请参考以下文章

无法将参数添加到查询字符串

将查询字符串参数添加到 Guzzle GET 请求?

查询长度未知时如何向查询添加参数

使用 jquery 将查询字符串添加到 url

在 URL Rails Routes 中添加 Hash 参数

如何将 glyphicons 添加到 rails link_to helper - Bootstrap 3