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.

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.


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

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

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"

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>" 

1
Gracias por el spreeejemplo, eres un ángel que cayó del cielo.
bonafernando
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.