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