2010-07-14 5 views
2

Je tente de créer des ressources imbriquées dans lesquelles la sous-ressource n'a pas d'existence propre. par exemple, une ressource Address qui est liée à un Person.Restriction des routes vers des ressources imbriquées dans Rails

Ma déclaration d'itinéraire ressemble à ceci:

map.resources :persons, 
:has_many => :addresses 

Cela me donne les routes suivantes:

   person_addresses GET /persons/:person_id/addresses     {:controller=>"addresses", :action=>"index"} 
    formatted_person_addresses GET /persons/:person_id/addresses.:format   {:controller=>"addresses", :action=>"index"} 
           POST /persons/:person_id/addresses     {:controller=>"addresses", :action=>"create"} 
           POST /persons/:person_id/addresses.:format   {:controller=>"addresses", :action=>"create"} 
      new_person_address GET /persons/:person_id/addresses/new    {:controller=>"addresses", :action=>"new"} 
formatted_new_person_address GET /persons/:person_id/addresses/new.:format  {:controller=>"addresses", :action=>"new"} 
      edit_person_address GET /persons/:person_id/addresses/:id/edit   {:controller=>"addresses", :action=>"edit"} 
formatted_edit_person_address GET /persons/:person_id/addresses/:id/edit.:format {:controller=>"addresses", :action=>"edit"} 
       person_address GET /persons/:person_id/addresses/:id    {:controller=>"addresses", :action=>"show"} 
    formatted_person_address GET /persons/:person_id/addresses/:id.:format  {:controller=>"addresses", :action=>"show"} 
           PUT /persons/:person_id/addresses/:id    {:controller=>"addresses", :action=>"update"} 
           PUT /persons/:person_id/addresses/:id.:format  {:controller=>"addresses", :action=>"update"} 
           DELETE /persons/:person_id/addresses/:id    {:controller=>"addresses", :action=>"destroy"} 
           DELETE /persons/:person_id/addresses/:id.:format  {:controller=>"addresses", :action=>"destroy"} 

Maintenant, je veux vous assurer que les adresses d'une personne sont en lecture seule, par exemple, je ne veulent que les actions show et index pour une adresse.

J'ai essayé ceci:

map.resources :persons, 
    :has_many => :addresses, 
    :collection => { :addresses => [ :show, :index ] } 

et a obtenu cette erreur:

(in /home/rmk/app) 
rake aborted! 
Invalid HTTP method specified in route conditions: {:method=>:show} 

(See full trace by running task with --trace) 

Est-il possible que je peux y parvenir?

EDIT: Mon problème principal était que je n'utilisais pas le bloc de code correctement (je voulais utiliser has_one etc. autant que possible). Alors mes persons routes ressemblent à ceci (par exemple un peu artificiel):

map.resources :persons, :has_one => :ssn, :except => [:new, :edit] do |person| 
person.resources :addresses, :only => [:index, :show] 
end 

Répondre

2

Est-ce que vous essayez de le faire? Cela crée des adresses en tant que ressource imbriquée de personnes, mais rend seulement les affichages d'index et d'affichage disponibles.

+0

Génial, Karl, merci. Comme je l'ai expliqué dans l'édition ci-dessus, je n'utilisais pas correctement le bloc de code (je voulais spécifier d'autres contraintes sur: personnes utilisant: has_one,: has_many etc, et ne recourant au bloc de code que si nécessaire). – rmk

Questions connexes