Параметры запроса с url_for?

url_for([:edit, @post])

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

/comments/123/edit

it is

/comments/123/edit?qp=asdf

Я пробовал url_for([:edit, @post], :qp => "asdf"), но не получилось.


person randomguy    schedule 17.02.2011    source источник


Ответы (4)


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

edit_post_path(@post, :qp => "asdf")
person Simone Carletti    schedule 17.02.2011
comment
Как я могу создать такой абсолютный путь? - person shredding; 22.11.2013
comment
Используйте _url вместо _path: edit_post_url(@post, :qp => "asdf") - person Simone Carletti; 22.11.2013

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

polymorphic_path([:edit, @post], :qp => 'asdf')
person epochwolf    schedule 15.10.2012

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

person Dmitry Polushkin    schedule 02.10.2013
comment
Это не указано в документации API. Большое спасибо, нужно больше голосов. - person Brad; 20.02.2018

ответ от Simone Carletti действительно работает, но бывают случаи, когда нужно создать URL-адрес с использованием объектов, как описано в Rails. руководство по маршрутизации и не полагаться на помощников _path.

Ответы от Бена и 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, как предложили Ben & Swards:

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.

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

person Michael Smart    schedule 30.10.2015