Как сгенерировать URL пользовательской отсортированной строки запроса в Rails link_to?

#ruby-on-rails #ruby-on-rails-3 #link-to #query-parameters #url-for

#ruby-on-rails #ruby-on-rails-3

Вопрос:

Когда я использую link_to helper в приложении Rails 3.0.7 со многими параметрами, оно генерирует лексикографически отсортированный URL-адрес, как, вероятно, упоминается в методе to_param для хэша в документации Activesupport. например

 link_to "my Link", {:u=>"user", :q=>"some query", :page=>"4"}
  

генерирует

 "/search?page=4amp;q=some queryamp;u=user"
  

но то, что я хочу, это

 "/search?u=useramp;q=some queryamp;page=4"
  

Кто-нибудь может выполнить пользовательскую сортировку, указанную в хэше параметров для link_to или url_for?

Если я чего-то не упустил, это, похоже, противоречит примеру, приведенному в документации для link_to (либо ri link_to , либо в файле /gems/actionpack-3.0.7/lib/action_view/helpers/url_helper.rb:215

   #   link_to "Nonsense search", searches_path(:foo => "bar", :baz => "quux")
  #   # => <a href="/searches?foo=baramp;amp;baz=quux">Nonsense search</a>
  

Конечно, я могу создать URL вручную, например

 link_to "my Link", "/search?u=#{user}amp;q=#{query}amp;page=#{page}"
  

но в этом случае отсутствовал бы ‘Rails way’ и возникла бы некоторая проблема с экранированием определенных символов, поэтому это был бы последний вариант.

Комментарии:

1. Просто любопытно, но зачем вам это делать?

2. У меня такое чувство, что если порядок параметров строки запроса важен, что-то еще может быть неправильным.

3. для отображения от более важной информации к менее важной. пользователь или запрос важнее страницы, когда URL отображается в контексте третьей стороны.

4. Вы используете Ruby 1.8 или 1.9?

5. Может быть, вам что-то нужно для Google Analytics???

Ответ №1:

Просматривая журналы фиксации rails, выясняется, что сортировка по параметру повторно вводится в rails 3.0.2 или около того. Вот журнал:

  $ git log activesupport/lib/active_support/core_ext/object/to_param.rb
...
commit 10dec0e65e1f4d87f411b4361045eba86b121be9
Author: Xavier Noria <fxn@hashref.com>
Date:   Tue Sep 28 00:32:20 2010  0200

    let Hash#to_param and Hash#to_query sort again

    This was a regression introduced in 5c858220085dc4ddc1bec496747059dfbe32f1da. We bring
    sorting back because people rely on it, eg for constructing consistent cache keys.

commit 5c858220085dc4ddc1bec496747059dfbe32f1da
Author: Santiago Pastorino <santiago@wyeworks.com>
Date:   Thu Jul 22 05:08:34 2010  0800

    Hash#to_param is doesn't use sort anymore, some tests added for Hash#to_param

...
  

Я исправил файл, удалив « .sort «, и порядок строк запроса соответствует желаемому. Может ли реализация пользовательского параметра to_param быть решением для получения строки запроса с пользовательской сортировкой / без сортировки? В таком случае, куда его следует поместить?

Комментарии:

1. Я полагаю, что сортировка используется для таких вещей, как кэширование действий, которое включает параметры. Сложно включить параметры в ключ кэша, если порядок параметров постоянно меняется.

Ответ №2:

Немного поздно, но для кого-то еще, кто столкнется с этим сообщением, использование to_query может помочь. Смотрите здесь старые документы или новые документы

Комментарии:

1. К сожалению, неверно. to_query имеет псевдоним to_param. Предоставленная вами ссылка также показывает sort! во фрагменте кода.