Geo*_*old 5 ruby ruby-on-rails-3
我想生成一个 URL,其中“p=1”查询参数出现在 URL 的末尾,例如:
/path?foo=X&bar=Y&p=1
Run Code Online (Sandbox Code Playgroud)
是否可以通过以下方式在生成 URL 时控制查询参数的顺序:
url_for(params.merge({ p: page_num }))
Run Code Online (Sandbox Code Playgroud)
?
更新:
我在下面尝试了ChuckE 的 建议。事实证明,在 Ruby 1.9 中,散列已经排序,因此其中的代码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}
Run Code Online (Sandbox Code Playgroud)
但是,url_for 仍然将“p”参数放在首位。似乎任何潜在的解决方案都需要解决如何url_for迭代哈希。
经过进一步挖掘,我发现发生的事情是这样的url_for实际上是按字典顺序对参数进行排序,而与它们在哈希中的插入顺序无关。显然,这样做是为了帮助缓存,因为 URL 参数通常用于页面缓存键。
简而言之,如果不打补丁就无法做到这一点Hash,具体来说,您需要重写,activesupport/core_ext/object/to_param.rb以便 Hash#to_param 不会调用.sort返回值。
相关问题:如何在 Rails link_to 中生成自定义排序查询字符串 URL?。