Я пытаюсь создать вложенные ресурсы, в которых под-ресурс не имеет своего собственного. например, ресурс Address
, который связан с Person
.Ограничение маршрутов для вложенных ресурсов в Rails
Моя декларация маршрут выглядит так:
map.resources :persons,
:has_many => :addresses
Это дает мне следующие маршруты:
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"}
Теперь я хочу, чтобы убедиться, что адрес человека только для чтения, то есть, я только show
и index
действия по адресу.
Я попытался это:
map.resources :persons,
:has_many => :addresses,
:collection => { :addresses => [ :show, :index ] }
и получил эту ошибку:
(in /home/rmk/app)
rake aborted!
Invalid HTTP method specified in route conditions: {:method=>:show}
(See full trace by running task with --trace)
Есть ли способ, я могу добиться этого?
EDIT: Моя основная проблема заключалась в том, что я не использовал блок кода правильно (я хотел как можно больше использовать has_one и т. Д.). Так что мои persons
маршруты выглядеть следующим образом (несколько надуманный пример):
map.resources :persons, :has_one => :ssn, :except => [:new, :edit] do |person|
person.resources :addresses, :only => [:index, :show]
end
Удивительный, Карл, спасибо. Как я объяснил в приведенном выше редактировании, я не использовал блок кода правильно (я хотел указать другие ограничения на: лица, использующие: has_one,: has_many и т. Д., И прибегать к блоку кода только тогда, когда это необходимо). – rmk