Ответ 1
Использовать именованные маршруты.
edit_post_path(@post, :qp => "asdf")
url_for([:edit, @post])
работает и генерирует /comments/123/edit
. Теперь мне нужно добавить параметр запроса, чтобы вместо
/comments/123/edit
это
/comments/123/edit?qp=asdf
Я пробовал url_for([:edit, @post], :qp => "asdf")
, но не пошел.
Использовать именованные маршруты.
edit_post_path(@post, :qp => "asdf")
Вы можете использовать polymorphic_path
polymorphic_path([:edit, @post], :qp => 'asdf')
Вы можете передать params
в url_for
. Оформить его в исходном коде: https://github.com/rails/rails/blob/d891c19066bba3a614a27a92d55968174738e755/actionpack/lib/action_dispatch/routing/route_set.rb#L675
Ответ от Simone Carletti действительно работает, но есть моменты, когда нужно сконструировать URL-адрес с использованием объектов, как описано в руководстве по маршрутизации Rails, и не полагаться на помощники _path
.
Ответы Ben и Swards пытаются точно описать, как это сделать, но для я использовал синтаксис в ошибке (используя Rails 4.2.2, который имеет то же поведение, что и 4.2.4, которое является текущим стабильным выпуском с этого ответа).
Правильный синтаксис для создания URL/пути от объектов, а также передающих параметров должен быть, в отличие от вложенного массива, скорее плоским массивом, содержащим компоненты URL, а также хешем в качестве конечного элемента:
url_for([:edit, @post, my_parameter: "parameter_value"])
Здесь первые два элемента анализируются как компоненты для URL-адреса, а хэш рассматривается как параметр (-ы) для URL-адреса.
Это также работает с link_to
:
link_to( "Link Text", [:edit, @post, my_parameter: "parameter_value"])
Когда я звоню url_for
, как было предложено Беном и Свард:
url_for([[:edit, @post], my_parameter: "parameter_value"])
Я получаю следующую ошибку:
ActionView::Template::Error (undefined method 'to_model' for #<Array:0x007f5151f87240>)
Трассировка показывает, что она вызывается из polymorphic_routes.rb
в ActionDispatch::Routing
, через url_for
из routing_url_for.rb
(ActionView::RoutingUrlFor
):
gems/actionpack-4.2.2/lib/action_dispatch/routing/polymorphic_routes.rb:297:in `handle_list'
gems/actionpack-4.2.2/lib/action_dispatch/routing/polymorphic_routes.rb:206:in `polymorphic_method'
gems/actionpack-4.2.2/lib/action_dispatch/routing/polymorphic_routes.rb:134:in `polymorphic_path'
gems/actionview-4.2.2/lib/action_view/routing_url_for.rb:99:in `url_for'
Проблема заключается в том, что она ожидает массив компонентов URL (например, символы, объекты модели и т.д.), а не массив, содержащий другой массив.
Рассматривая соответствующий код из routing_url_for.rb
, мы можем видеть, что когда он получает массив, который имеет хеш в качестве конечного элемента, он будет extract хешем и обрабатывать как параметры, оставив тогда только массив с компонентами URL.
Вот почему плоский массив с хешем работает как последний элемент, а вложенный массив - нет.
В рельсах 4 вы можете сделать это: url_for([[:edit, @post], :qp => "asdf"])
Обратите внимание на дополнительный синтаксис массива.