我想生成一个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
如何迭代哈希。
答案 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)
应该为你做的伎俩。