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