9
votes

Routes nommées Nommé fournies par Rails 3 Moteurs

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> xxx pré>

de ma configuration de la demande / routres.rb: p> xxx pré>

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


0 commentaires

6 Réponses :


6
votes

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 , qui appelle add_route sur la routreset (défini dans montage en rack-0.6.14 / lib / rack / monture / montage / route_set.rb 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.


1 commentaires

Cela confirme mes peurs; Si une réponse alternative n'est pas fournie bientôt, je vais accepter cette réponse. Merci.



2
votes

Vous avez besoin d'ajouter un crochet d'initialisateur à config / application.rb, comme celui-ci: xxx

c'est charger des roues.rb de votre moteur en premier et vous pouvez remplacer leurs itinéraires. < / p>


1 commentaires

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



8
votes

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: xxx

puis dans le fichier itinéraires de l'application de base: xxx

Je peux ensuite remplacer tous les itinéraires dans l'application de base avec ceux du moteur.

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.


0 commentaires

4
votes

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 prépendez sur le routeur du moteur: xxx

Si l'espace de noms du moteur est isolé, cela utilisera le quelquewherecontroller de à l'intérieur de l'espace de noms du moteur. Si ce n'est pas le cas, il utilisera le type typique quelquewherecontroller .

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 : xxx


0 commentaires

2
votes

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 Ajout au lieu de prépendez , comme: xxx

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.


0 commentaires

1
votes

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'


0 commentaires