Rails:控制url_for中查询参数的排序?

时间:2012-07-26 10:32:31

标签: ruby ruby-on-rails-3

我想生成一个URL,其中“p = 1”查询参数出现在URL的末尾,如:

/path?foo=X&bar=Y&p=1

通过以下方式生成URL时是否可以控制查询参数的顺序:

url_for(params.merge({ p: page_num }))

更新

我尝试了ChuckE's suggestion below。事实证明,在Ruby 1.9中已经对Hashes进行了排序,因此ActiveSupport::OrderedHash中的代码实际上是无操作的。您可以使用Ruby 1.9验证订单是否已保留:

>> h = {one: 1, two: 2, three: 3 }
{:one=>1, :two=>2, :three=>3}
>> f = h.except(:one)
{:two=>2, :three=>3}
>> f[:one] = 1
1
>> f
{:two=>2, :three=>3, :one=>1}

但是,url_for 仍然首先放置“p”参数。似乎任何可能的解决方案都需要解决url_for如何迭代哈希。

2 个答案:

答案 0 :(得分:2)

在进一步挖掘之后,我发现正在发生的事情是url_for实际上按字典顺序按键排序参数,与散列中的插入顺序无关。显然,这是为了帮助缓存,因为URL params通常用于页面缓存键。

简而言之,如果不修补Hash,就无法执行此操作,具体而言,您需要覆盖activesupport/core_ext/object/to_param.rb,以便Hash#to_param不会在返回值上调用.sort。< / p>

相关问题:How to generate custom sorted query string URL in Rails link_to?

答案 1 :(得分:1)

第一个问题是:你为什么需要这样的东西?参数在url中出现的顺序不会影响服务器获取它们的方式,因为它们是基本的键/值关联。因此,无论参数出现在何处,它都将始终被服务器识别。

尽管如此,回答你的问题,是的,这是有可能的。你只需要使用有序的哈希。它们可通过积极支持获得。

opts = OrderedHash.new
opts[:foo] = 'X'
opts[:bar] = 'Y'
opts[:p] = 1
your_helper_url(opts)

应该为你做的伎俩。