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

时间:2011-07-08 13:41:39

标签: 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>

上述代码的问题在于它“添加”参数并且不“替换”它们。我想在不添加新值的情况下替换&amp; sort =参数的值。例如。我不想要:

../&sort=price_lowest&sort=price_lowest&sort=default

使用当前的逻辑 - 我得到了上述行为。有什么建议吗?

5 个答案:

答案 0 :(得分:43)

为了保留参数,我这样做了:

<%= link_to 'Date', params.merge(sort: "end_date") %>

然而,网址会很难看。

<强>更新

对于Rails 5使用:

<%= link_to 'Date', request.params.merge(sort: "end_date") %>

答案 1 :(得分:29)

如果你只需要一个cgi param并希望保持在同一页面上,这很容易实现:

<%= link_to "lowest prices", :sort => "price_lowest" %>

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

<%= link_to "lowest prices", :sort => "price_lowest", :other_param => params[:other] %>

如果您需要转到另一个页面,命名路线只会真正帮助您。

答案 2 :(得分:13)

如果未将路径传递给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) %>

引用:

答案 3 :(得分:0)

这不是您要问的问题的答案,但是您是否考虑过使用Sorted gem来处理排序逻辑和查看链接?

答案 4 :(得分:0)

我在Rails 3.1上的工作解决方案 当然,它是硬编码,必须重构。

项目模型

  def self.get(field,value)
    where(field=>value)
  end

项目控制器

@items=Item.all
 if params[:enabled]
  @items=@items.get(:enabled, params[:enabled])
end
if params[:section]
  @items=@items.get(:section_id, params[:section])
end

项目助手

def filter_link(text, filters={}, html_options={})
  trigger=0
  params_to_keep = [:section, :enabled]
  params_to_keep.each do |param|
    if filters[param].to_s==params[param] && filters[param].to_s!="clear" || filters[param].to_s=="clear"&&params[param].nil?
      trigger=1
    end
    if filters[param]=="clear"
      filters.delete(param)
    else
      filters[param]=params[param] if filters[param].nil?
    end
  end
  html_options[:class]= 'current' if trigger==1
  link_to text, filters, html_options
end

项目index.html.erb

<%= filter_link 'All sections',{:section=>"clear"} %>
<% @sections.each do |section| %>
   <%= filter_link section.title, {:section => section} %>
<% end %>

<%= filter_link "All items", {:enabled=>"clear"} %>
<%= filter_link "In stock", :enabled=>true %>
<%= filter_link "Not in stock", :enabled=>false %>