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.

Derek Thurn
la source

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.

Chubas
la source
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
aghull
la source
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
user3622458
la source
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"
Deepak Mahakale
la source
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>" 
Arup Rakshit
la source
1
Merci pour l' spreeexemple, vous êtes un ange qui est tombé du ciel.
bonafernando