Routes nommées dans monté moteur rails
Je suis en train de faire un petit moteur rails qui j'ai monter comme ceci:
mount BasicApp::Engine => "/app"
À l'aide de cette réponse j'ai vérifié que toutes les routes dans le moteur sont comme le devrait être:
Toutefois - lorsque j' (à l'intérieur du moteur) lien vers une route nommée (définie à l'intérieur du moteur), j'obtiens cette erreur
undefined local variable or method `new_post_path' for #<#<Class:0x000000065e0c08>:0x000000065d71d0>
En cours d'exécution "râteau route" clairement vérifie que "new_post" doit être un nom de chemin d'accès, donc je n'ai aucune idée de pourquoi Rails (3.1.0) ne peut pas comprendre. Toute aide est la bienvenue
ma config/route.rb (pour le moteur) ressembler à ceci
BasicApp::Engine.routes.draw do
resources :posts, :path => '' do
resources :post_comments
resources :post_images
end
end
Je dois ajouter qu'il est et moteur isolé. Cependant les chemins comme main_app.root_path fonctionne très bien - alors que root_path ne pas
- Si vous êtes arrivé ici parce que vous rencontrez des problèmes avec le Blogit gem - vous pouvez ignorer les solutions ci-dessous (qui travaillent pour d'autres applications) et aller à votre blogit.rb fichier et de décommenter la ligne: config.inline_main_app_named_routes = true
Vous devez vous connecter pour publier un commentaire.
Le droit chemin
Je crois que la meilleure solution est d'appeler
new_post_path
sur les routes de l'Engine proxy, qui est disponible comme une méthode d'aide. Dans votre cas, l'aide de la méthode par défautbasic_app_engine
, de sorte que vous pouvez appelerbasic_app_engine.new_post_path
dans vos points de vue ou des aides.Si vous le souhaitez, vous pouvez définir le nom de l'une des deux façons.
ou
Dans les deux cas, vous pouvez ensuite appeler
basic.new_posts_path
dans vos points de vue ou des aides.Une autre façon
Une autre option est de ne pas utiliser un moteur monté et à la place que le moteur ajouter les itinéraires directement à l'application. Thoughtbot de la haute tension fait cela. Je n'aime pas cette solution car elle est susceptible de causer des conflits d'espace de noms lorsque vous ajoutez plusieurs moteurs, mais il fonctionne.
Sur Rails 4 la
engine_name
directive n'a pas de travail pour moi.Pour accéder à une route nommée défini dans le moteur de routes à partir du moteur propre point de vue ou le contrôleur, j'ai fini par utiliser la verbose
Je recommande la définition d'une simple méthode d'assistance pour le rendre plus utilisable
Dans cet endroit vous pouvez maintenant utiliser
Dans le cas où vous avez besoin d'accéder à votre application principale helper pour le moteur, vous pouvez simplement utiliser
main_app
:BasicApp::Engine.routes.url_helpers
génère un nouveauModule
et définit tout le chemin/url méthodes d'aide à chaque fois que vous l'appelez. Il peut rapidement devenir un rendement et problème de mémoire. Je vous le recommande, y compris dans la classe où vous souhaitez l'utiliser.return @@basic_app_engine_url_helpers ||= BasicApp::Engine.routes.url_helpers
utiliser le ci-dessous dans votre application pour accéder au moteur de routes