2010-08-09 4 views
1

Voici mon dilemme: J'ai deux types de routes qui sont sémantiquement très différentes et qui devraient aller à des contrôleurs différents.Gérer les routes ambiguës dans Rails

ny/new-york/brooklyn/cleaners # should go to a list of cleaners for a neighborhood 
ny/new-york/cleaners/mrclean # should go to an individual cleaner's page 

Notez que "brooklyn" et "nettoyeurs" ici ne sont que des exemples. L'application dispose de nombreux types de services (par exemple, "nettoyeur") et de nombreux voisinages. Il est donc impossible de coder en dur une liste de deux dans une expression régulière et de l'utiliser pour distinguer les deux routes.

Est-il possible d'impliquer une méthode arbitraire, qui accède aux modèles ActiveRecord, dans la décision de routage? J'utilise Rails 2.3.8.

Répondre

5

Modifier: nouvelle réponse avec les services dynamiques

En regardant ce blog entry il semble possible d'utiliser ActiveRecords dans les routes.

Peut-être que vous pourriez faire quelque chose comme ceci:

service_names = Service.all.map(&:short_name) # assuming the property 'short_name' is the value used in urls 
service_names.each do |service_name| 
    map.connect ':state/:city/#{service_name}/:company' :controller => ‘company’, :action => ‘show’ # to show the company's page 
    map.connect ':state/:city/:neighborhood/#{service_name}_finder' :controller => ‘company_finder’, :action => ‘find’ # to list the companies for the given service in a neighborhood 
end 

Cela devrait éviter encore des conflits depuis les routes pour un certain service est avant une route pour un quartier


Vieille mauvaise réponse Vous ne pouvez pas utiliser les deux routes suivantes?

map.connect ':state/:city/cleaners/:cleaner' :controller => ‘cleaners’, :action => ‘show’ # to show the cleaner's page 
map.connect ':state/:city/:neighborhood/cleaners' :controller => ‘cleaner_finder’, :action => ‘find’ # to list the cleaners of a neighborhood 

Dans votre contrôleur, vous devriez être en mesure de récupérer: état,: la valeur de la ville et d'autres en utilisant params [: Etat], params [: ville], etc.

Mettre le: Etat /: city ​​/ cleaners /: nettoyeur sur la première ligne devrait éviter toute ambiguïté.

+1

+1. Nitpick: Pour une raison quelconque, ils sont supposés utiliser des contrôleurs différents. – alternative

+0

Correction, merci. – David

+0

Remarque: "L'application dispose de nombreux types de services (par exemple," nettoyeur "), donc je ne peux pas les coder en dur comme vous l'avez fait ici avec" nettoyeurs ". – lawrence