Rails: Vérifier la sortie de l'assistant de chemin depuis la console


288

Rails définit un tas de magie avec des itinéraires nommés qui font des aides pour vos itinéraires. Parfois, en particulier avec les itinéraires imbriqués, il peut être un peu déroutant de garder une trace de l'URL que vous obtiendrez pour un appel de méthode d'assistance d'itinéraire donné. Est-il possible, à l'aide de la console Ruby, de voir quel lien une fonction d'assistance donnée va générer? Par exemple, étant donné une aide nommée comme post_path (post), je veux voir quelle URL est générée.

Réponses:


422

Vous pouvez les montrer rake routesdirectement avec .

Dans une console Rails, vous pouvez appeler app.post_path. Cela fonctionnera dans Rails ~ = 2.3 et> = 3.1.0.


7
Juste dans le prolongement de mon propre commentaire, il semble que cela soit possible à partir de la console rails 3, au cas où vous l'utilisez. Tout d'abord, collez une fausse demande dans votre objet d'application, en appelant quelque chose comme app.get "/" alors juste instance_eval les méthodes voulues, car elles sont maintenant protégées par défaut. Quelque chose comme: app.instance_eval{ post_path(post) }
Chubas

Le commentaire de Chubas ci-dessus a fonctionné dans Rails 3. Ceci est très utile lors de l'écriture de tests, donc je n'ai pas à attendre 1 minute pour découvrir que l'itinéraire n'est pas correct. De plus, il est bon de tester les appels get et post. Vous n'avez pas besoin d'appeler app.get en premier.
B Seven

7
app.teh_pathfonctionne toujours dans Rails 4.0 et est utile pour séparer les chemins de moteur des chemins d'application principaux.
nurettin

5
Si vous montez un moteur, par exemple mount Spree::Core::Engine, :at => '/', vous accéderez aux chemins via le nom du moteur, comme app.spree_core_engine.some_path. Ou, si le "nom_moteur" est configuré pour être quelque chose de différent comme dans ce code, vous le feriez app.spree.some_path.
Jordan Brough

J'ai dû ajouter le host paramètre comme ceci:app.article_url(my_article, host: 'mydomain.com')
Besi

352

vous pouvez également

include Rails.application.routes.url_helpers

à partir d'une session de console pour accéder aux assistants:

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

ou

Rails.application.routes.url_helpers.users_path

4
C'est beaucoup plus facile que la solution ci-dessus IMO
Andrew

2
c'est la bonne réponse à la question d'origine à mon avis
nemesisdesign

Cela devrait être la meilleure réponse IMO
Luke

4
Je ne peux pas me soucier de m'en souvenir, donc je reviens ici tous les deux jours pour copier / coller. Merci.
Spencer

1
Ne pourriez-vous pas également référencer les url_helpers directement à partir de la console, comme Rails.application.routes.url_helpers.users_path?
TheMadDeveloper

25

Dans la console Rails, l'application variable contient un objet de session sur lequel vous pouvez appeler des assistants de chemin d'accès et d'URL en tant que méthodes d'instance.

app.users_path

11

Vous pouvez toujours vérifier la sortie de path_helpersdans la console. Utilisez simplement l'aide avecapp

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

app.posts_path
#=> "/posts"

app.posts_url
#=> "http://www.example.com/posts"

2

Rappelez-vous si votre itinéraire est à espacement de nom, comme:

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

Puis essayez :

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

production

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
Merci pour l' spreeexemple, vous êtes un ange qui est tombé du ciel.
bonafernando
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.