6

次のように、「p=1」クエリパラメータがURLの最後に表示される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#to_paramが戻り値を呼び出さないようHashにオーバーライドする必要があります。activesupport/core_ext/object/to_param.rb.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 に答える