2010-11-14 9 views
4

J'ai récemment rejoint le monde du développement d'applications Rails (Rails3) et je peux abuser du routage ingénieux.Rails3: Utilisation appropriée du routage et des ressources

Le routage ingénieux par défaut rend certaines méthodes d'assistance vraiment pratiques pour les URL que j'utilise constamment. Mon problème est que j'ai des contrôleurs que j'ai spécifié le routage comme inventif simplement pour tirer parti de ces méthodes d'assistance. J'ai une navigation de base de site qui n'a aucune affaire avec des ressources.

resource :home do 
    member do 
    get 'main' 
    get 'about' 
    get 'login' 
    get 'help' 
    end 
end 

Y a-t-il une meilleure façon de faire ce que j'ai fait? Tout ce qui ne nécessite pas que j'ajoute manuellement des entrées de routage chaque fois que j'ai une nouvelle action du contrôleur? Pour clarifier, je veux spécifier le routage pour un contrôleur sans avoir à ajouter explicitement de nouvelles actions mais je veux aussi qu'il génère automatiquement des méthodes auxiliaires. Jusqu'à présent, je dois ajouter explicitement des routes pour chaque action que je veux faire. Je peux obtenir quelque chose de similaire en faisant cela (d'une manière non-débrouillards),

match 'home/about' => 'home#about' 

Mais je ne veux pas avoir à écrire que très toutes les routes qui ne tombe pas dans la convention.

+0

Peut-être que je vous mal compris, mais il semble que si vous voulez regarder automatiquement par votre contrôleur pour le public méthodes, et créer des itinéraires nommés pour eux. Est-ce que je lis bien? Si oui, il semble que vous demandiez une sorte de magie que même Rails ne peut fournir. –

+0

Non, je pense que vous avez raison. Pour donner un exemple, avoir une ligne comme "match": controller (/: action) "" détecte automagiquement les actions du contrôleur et génère des routes nommées. Je suis encore en train d'apprendre quel type de tricks est disponible. D'un autre côté, cela ne me dérangerait pas que quelqu'un recommande une meilleure approche ou donne quelques exemples de la façon dont ils font cela pour leurs applications. –

Répondre

1

Vous pouvez rechercher des méthodes d'instances publiques dans votre automate et générer automatiquement des itinéraires.

# routes.rb 
HomeController.public_instance_methods(false).select{|m| !(m.to_s =~ /^_/)}.each do |m| 
    match "home/#{m}", :action => m, :controller => HomeController, :as => "home_#{m}" 
end 

Cela prendra les explicites (non héritées) les méthodes d'instance publique de votre contrôleur, et sélectionnez ceux qui ne pas commencent par un trait de soulignement (parce que les soulignés sont générés des méthodes pour les filtres, le reste sont des actions réelles). Ensuite, il va générer une route nommée pour chacun. Gardez à l'esprit que routes.rb est traité uniquement au démarrage du serveur. Vous devrez donc redémarrer le serveur après avoir ajouté de nouvelles actions.

+0

Voilà ce que je regardais juste maintenant. Pas pour vous pousser plus loin mais comment cela pourrait-il être fait de manière plus générique pour que je puisse lui passer un nom de contrôleur? Par exemple (en supposant qu'il appelle la méthode que vous avez définie), generate_named_routes: home. J'essayais de comprendre s'il y avait déjà du code dans Rails qui pourrait prendre: home et le transformer en HomeController. Il serait alors simple d'avoir une méthode généralisée pour générer des routes nommées. –

+0

Essayez le contrôleur '" # {my_symbol.to_s.classify} ".constantize' pour convertir un symbole en sa classe de contrôleur correspondante. vous pouvez placer cette classe dans une variable et l'utiliser au lieu de spécifier directement le contrôleur comme ci-dessus. – edgerunner

+0

Merci pour la direction! J'ai fini par le faire mais pour ajouter à mon histoire, j'ai eu un terrible oubli. Cela dépend d'une méthode d'action présente sur le contrôleur. Dans certains cas, j'ai une vue qui n'a pas de méthode d'action définie pour cela ... Je retombe sur l'auto-cartographie des vues de Rails. Si je voulais aller plus loin, je devrais faire quelques reniflements de vues, de méthodes d'action, etc. Soudain, il est facile d'utiliser "match 'home/about'". Merci encore! –

2

En voici une autre plus simple. Il suffit d'ajouter une route générique au fond de votre routes.rb

match ":controller/:action" 

et il la carte directement à l'action spécifiée du contrôleur spécifié. Vous pouvez être un peu plus précis si vous le souhaitez. Par exemple, en utilisant get au lieu de match limiter aux demandes HTTP GET, en spécifiant les contrôleurs applicaple etc.

get ":controller/:action", :constraints => { :controller => /home|help/ }