2011-02-17 14 views
23
url_for([:edit, @post]) 

funciona y genera /comments/123/edit. Ahora tengo que añadir un parámetro de consulta, por lo que en lugar de¿Quieres consultar los parámetros con url_for?

/comments/123/edit 

Es

/comments/123/edit?qp=asdf 

Probé url_for([:edit, @post], :qp => "asdf") pero no ir.

Respuesta

26

Utilice las rutas con nombre.

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

¿Cómo puedo crear una ruta absoluta como esa? – shredding

+3

Utilice '_url' en lugar de' _path': 'edit_post_url (@post,: qp =>" asdf ")' –

18

Puede utilizar polymorphic_path

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

En los carriles 4 se puede hacer esto: url_for([[:edit, @post], :qp => "asdf"])

Nota de la sintaxis de matrices adicional.

5

answer de Simone Carletti funciona, pero hay ocasiones en las que uno quiere construir la URL usando objetos como se describe en la guía de enrutamiento Rails, y no confiar en los ayudantes _path.

Las respuestas de Ben y Swards intentan describir exactamente cómo hacer esto, pero para mí la sintaxis utilizada da como resultado un error (usando Rails 4.2.2, que tiene el mismo comportamiento que 4.2.4, que es la versión estable actual a partir de esta respuesta).

La sintaxis correcta para crear un URL/ruta a partir de objetos al mismo tiempo que el paso de parámetros debe ser, en oposición a una matriz anidada, en lugar una matriz plana que contiene los componentes de URL, además de un hash como el elemento final:

url_for([:edit, @post, my_parameter: "parameter_value"])

Aquí los primeros dos elementos se analizan como los componentes de la URL, y el hash se considera como parámetro (s) para la URL.

Esto también funciona con link_to:

link_to("Link Text", [:edit, @post, my_parameter: "parameter_value"])

Cuando llamo url_for según lo sugerido por Ben & praderas:

url_for([[:edit, @post], my_parameter: "parameter_value"])

me sale el siguiente error:

ActionView::Template::Error (undefined method 'to_model' for #<Array:0x007f5151f87240>)

La traza muestra que esta está siendo llamado de polymorphic_routes.rb en ActionDispatch::Routing, a través de url_for de 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' 

El problema de ser, que está esperando un conjunto de componentes de las URL (por ejemplo. símbolos, objetos de modelo, etc.), no una matriz que contiene otra matriz.

En cuanto a la adecuada code de routing_url_for.rb, podemos ver que cuando se recibe una matriz que tiene un hash como elemento final, será entonces extract el hash y tratar como parámetros, dejando a continuación, sólo la matriz con los componentes de las URL .

Por eso, la matriz plana con un hash como último elemento funciona, y la matriz anidada no.