Подтвердить что ты не робот

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

url_for([:edit, @post])

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

/comments/123/edit

это

/comments/123/edit?qp=asdf

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

4b9b3361

Ответ 1

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

edit_post_path(@post, :qp => "asdf")

Ответ 2

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

polymorphic_path([:edit, @post], :qp => 'asdf')

Ответ 4

Ответ от 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.

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

Ответ 5

В рельсах 4 вы можете сделать это: url_for([[:edit, @post], :qp => "asdf"])

Обратите внимание на дополнительный синтаксис массива.