Je travaille sur un rubis sur Rails 3 (0,0) Application qui utilise un moteur de rails. Cependant, dans mon application locale, je souhaite remplacer l'une des routes fournies par le moteur Rails.
de la configuration du moteur / routes.rb: p> de ma configuration de la demande / routres.rb: p> Cependant, lorsque j'inspecte les itinéraires, les deux semblent être actifs (et leur itinéraire semble "gagnant", au moins dans les contrôleurs de moteur) P> $ rake routes
the_route /my_named_route(.:format) {:controller=>"controller", :action=>"action"}
the_route /their_named_route(.:format) {:controller=>"controller", :action=>"action"}
6 Réponses :
J'ai bien peur qu'il n'y ait pas de manière aussi simple. Les itinéraires sont définis dans lib / action_dispatch / routage / mapper.rb: 271 code>, qui appelle add_route sur la routreset (défini dans
montage en rack-0.6.14 / lib / rack / monture / montage / route_set.rb code> et à la ligne 71, le nom est joint). Il n'y a pas de méthode Supprimer_Route et l'itinéraire du moteur est ajouté en dernier. Vous pouvez ajouter votre itinéraire manuellement une fois que l'application est initialisée avec des rails.Application.routes.draw au lieu de l'avoir dans Routtres.rb, ou vous pouvez corriger le moteur. P>
Cela confirme mes peurs; Si une réponse alternative n'est pas fournie bientôt, je vais accepter cette réponse. Merci.
Vous avez besoin d'ajouter un crochet d'initialisateur à config / application.rb, comme celui-ci: c'est charger des roues.rb de votre moteur en premier et vous pouvez remplacer leurs itinéraires. P> < / p>
J'ai du mal à confirmer cela fonctionne réellement, mais cela semble aussi dangereux / déroutant / laid. Je suppose que l'approche "droite" serait de faire modifier le moteur à exposer une méthode pouvant être appelée dans la configuration de l'application / routes.rb
J'ai entouré cela en déplaçant les itinéraires de mon moteur à partir de config / routtes.rb vers une méthode de classe dans la classe de moteur elle-même: puis dans le fichier itinéraires de l'application de base: p> Je peux ensuite remplacer tous les itinéraires dans l'application de base avec ceux du moteur. p> Notez que les itinéraires primordiaux doivent être définis avant les itinéraires remplacés puisque les voies définies précédentes prennent la priorité sur les plus tard. p> p>
Il n'y a aucun moyen de remplacer un itinéraire dans un moteur. Au lieu de cela, vous devez définir un itinéraire de dépassement. Vous pouvez le faire en appelant Si l'espace de noms du moteur est isolé, cela utilisera le Si vous souhaitez remplacer un itinéraire pour renvoyer un 404, le meilleur moyen que je puisse penser est de rediriger vers une page 404 : p> prépendez code> sur le routeur du moteur:
quelquewherecontroller code> de à l'intérieur de l'espace de noms du moteur. Si ce n'est pas le cas, il utilisera le type typique
quelquewherecontroller code>. P>
Vous pouvez préparer des itinéraires comme suggéré par Ryan Bigg ci-dessus. J'ai trouvé que dans l'ordre annuler l'aide de la route nommée avec mon itinéraire personnalisé, j'ai besoin d'appeler Sinon, l'application contient les deux itinéraires et l'aide nommée pour le routeur du moteur est la dernière définition, et donc celle qui est appliquée. P> p> Ajout code> au lieu de
prépendez code>, comme:
Les règles de routage définies dans les routes.rb sont appliquées de haut en bas jusqu'à ce qu'une correspondance soit trouvée. J'ai été capable de remplacer la route définie dans le moteur monté simplement en déplaçant la règle de priorité supérieure ci-dessus em> la ligne où le moteur est monté. Donc, p> mount My::Engine => '/'
get 'about', controller: 'static', action: 'about', as: 'about'