6

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

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

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

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

?

更新:

我在下面尝试了 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}

但是,url_for 仍然将“p”参数放在首位。似乎任何潜在的解决方案都需要解决如何url_for迭代哈希。

4

2 回答 2

4

在进一步挖掘之后,我看到正在发生的事情url_for实际上是按字典顺序对参数进行排序,与它们在哈希中的插入顺序无关。显然,这样做是为了帮助缓存,因为 URL 参数通常用于页面缓存键。

简而言之,不打补丁是不行的Hash,具体来说,你需要重写activesupport/core_ext/object/to_param.rb,这样 Hash#to_param 就不会调用.sort返回值。

相关问题:如何在 Rails link_to 中生成自定义排序查询字符串 URL?.

于 2012-11-03T20:36:42.933 回答
1

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

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

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

应该为您解决问题。

于 2012-07-26T11:47:49.257 回答