2009-11-13 6 views
0

Donc dans mon application rails j'ai deux ressources (locations, et réservations) qui appartiennent à un utilisateur. C'est le code dans mes routes.rb pour configurer les routes imbriquées.Plusieurs itinéraires imbriqués, existe-t-il une meilleure façon de procéder?

map.resources :users, :has_many => :reservations, :shallow => true 
    map.resources :users, :has_many => :rentals, :shallow => true 
    map.resources :rentals, :only => [:index] 
    map.resources :reservations, :only => [:index] 

Y a-t-il une façon plus performante de le faire? J'ai fait quelques recherches mais je ne trouve pas de réponse claire.

Merci d'avance.

-ray

Répondre

6

Votre méthode duplique les itinéraires pour les utilisateurs, comme vous pouvez le voir en exécutant rake routes. Vous pouvez corriger cela en passant un bloc à map.resources:

map.resources :users, :shallow => true do |user| 
    user.resources :reservations 
    user.resources :rentals 
end 

Les routes imbriquées créées considérerons que vous voulez toujours accéder à ces ressources de façon imbriquée.

Si vous avez vraiment besoin de tous les itinéraires que vous avez défini (y compris l'indice de la location et les réservations non-imbriquée), vous devrez ajouter:

map.resources :rentals, :only => [:index] 
map.resources :reservations, :only => [:index] 

Et je ne sais pas d'une manière sèche pour faire ça.

1

Vous pouvez définir des itinéraires imbriqués avec des blocs

map.resources :users, :shallow => true do |user| 
    user.resources :reservations, :only => [:index] 
    user.resources :rentals, :only => [:index] 
end 

Je pense que cette façon est un peu plus clair et peut être réglée plus facilement par la suite lorsque vous avez besoin d'options supplémentaires sur l'un des ressources imbriquées.

Les différentes options et les détails sont les ActionController Resources API page

+0

Même commentaire que j'ai laissé sur la réponse de kchau: cela ne crée pas toutes les routes comme l'original. – ScottJ

1

Nids les deux ressources sous les utilisateurs:

map.resources :users, :shallow => true do |users| 
    users.resources :reservations, :only => :index 
    users.resources :rentals, :only => :index 
    end 

Edit: Désolé, oublié l'option: peu profonde.

+0

Cela ne crée pas toutes les routes comme l'original. L'OP possède une liste complète des routes imbriquées, plus une route non imbriquée (index). – ScottJ

+0

ScottJ a raison, mon extrait de code ne produira qu'un sous-ensemble des routes que souhaite OP. – kafuchau