Rieles: compruebe la salida del asistente de ruta desde la consola

288

Rails define un montón de magia con rutas con nombre que hacen ayudantes para tus rutas. A veces, especialmente con rutas anidadas, puede ser un poco confuso hacer un seguimiento de qué URL obtendrá para una llamada de método auxiliar de ruta determinada. ¿Es posible, usando la consola de Ruby, ver qué vínculo generará una función auxiliar determinada? Por ejemplo, dado un ayudante con nombre como post_path (post), quiero ver qué URL se genera.

Derek Thurn
fuente

Respuestas:

422

Puedes mostrarlos rake routesdirectamente.

En una consola Rails, puedes llamar app.post_path. Esto funcionará en Rails ~ = 2.3 y> = 3.1.0.

Chubas
fuente
77
Solo en un seguimiento de mi propio comentario, parece que esto es posible desde la consola de rails 3, en caso de que lo esté utilizando. Primero, pegue una solicitud falsa en el objeto de su aplicación, llamando a algo así como app.get "/" instancia_eval los métodos deseados, ya que ahora están protegidos de forma predeterminada. Algo así como: app.instance_eval{ post_path(post) }
Chubas
El comentario anterior de Chubas funcionó en Rails 3. Esto es muy útil al escribir pruebas, por lo que no tengo que esperar 1 minuto para descubrir que la ruta no es correcta. Además, es genial probar y recibir llamadas. No necesita llamar a app.get primero.
B Seven
77
app.teh_pathtodavía funciona en Rails 4.0 y es útil para separar las rutas del motor de las rutas principales de la aplicación.
nurettin
55
Si está montando un motor, por ejemplo mount Spree::Core::Engine, :at => '/', accedería a las rutas a través del nombre del motor, como app.spree_core_engine.some_path. O, si el "nombre_motor" está configurado para ser algo diferente como en este código, entonces lo haría app.spree.some_path.
Jordan Brough
Tuve que agregar el hostparámetro así:app.article_url(my_article, host: 'mydomain.com')
Besi
352

tú también puedes

include Rails.application.routes.url_helpers

desde dentro de una consola sesiones para acceder a los ayudantes:

url_for controller: :users, only_path: true
users_path
# => '/users'

o

Rails.application.routes.url_helpers.users_path
aghull
fuente
44
Esto es mucho más fácil que la solución anterior OMI
Andrew
2
esta es la respuesta correcta a la pregunta original en mi opinión
nemesisdesign
Esta debería ser la mejor respuesta OMI
Lucas
44
No puedo molestarme en recordar esto, así que solo vuelvo aquí cada dos días para copiar / pegar. Gracias.
Spencer
1
¿No podrías también hacer referencia a url_helpers directamente desde la consola, como Rails.application.routes.url_helpers.users_path?
TheMadDeveloper
25

En la consola de Rails, la aplicación variable contiene un objeto de sesión en el que puede llamar a los ayudantes de ruta y URL como métodos de instancia.

app.users_path
usuario3622458
fuente
11

Siempre puede verificar la salida de path_helpersen la consola. Solo usa el ayudante conapp

app.post_path(3)
#=> "/posts/3"

app.posts_path
#=> "/posts"

app.posts_url
#=> "http://www.example.com/posts"
Deepak Mahakale
fuente
2

Recuerde si su ruta está espaciada por nombre, como:

product GET  /products/:id(.:format)  spree/products#show

Entonces intenta :

helper.link_to("test", app.spree.product_path(Spree::Product.first), method: :get)

salida

Spree::Product Load (0.4ms)  SELECT  "spree_products".* FROM "spree_products"  WHERE "spree_products"."deleted_at" IS NULL  ORDER BY "spree_products"."id" ASC LIMIT 1
=> "<a data-method=\"get\" href=\"/products/this-is-the-title\">test</a>" 
Arup Rakshit
fuente
1
Gracias por el spreeejemplo, eres un ángel que cayó del cielo.
bonafernando