Запрос параметров с помощью url_for? - PullRequest
29 голосов
/ 17 февраля 2011
url_for([:edit, @post])

работает и генерирует /comments/123/edit. Теперь мне нужно добавить параметр запроса, чтобы вместо

/comments/123/edit

это

/comments/123/edit?qp=asdf

Я пытался url_for([:edit, @post], :qp => "asdf"), но не пошел.

Ответы [ 4 ]

30 голосов
/ 17 февраля 2011

Использовать именованные маршруты.

edit_post_path(@post, :qp => "asdf")
20 голосов
/ 15 октября 2012

Вы можете использовать polymorphic_path

polymorphic_path([:edit, @post], :qp => 'asdf')
13 голосов
/ 02 октября 2013

Вы можете передать params на url_for.Оформить заказ в исходном коде: https://github.com/rails/rails/blob/d891c19066bba3a614a27a92d55968174738e755/actionpack/lib/action_dispatch/routing/route_set.rb#L675

10 голосов
/ 30 октября 2015

Ответ от 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, мы можем видеть, что когда он получаетмассив, который имеет хеш в качестве конечного элемента, затем он извлекает хеш и обрабатывает как параметры, оставляя затем только массив с компонентами URL.

Именно поэтому плоский массивс хешем как последний элемент работает, а вложенный массив - нет.

...