2010-07-14 2 views
2

Я пытаюсь создать вложенные ресурсы, в которых под-ресурс не имеет своего собственного. например, ресурс 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 

ответ

2

Это то, что вы пытаетесь сделать?

map.resources :persons do |person| 
    person.resources :addresses, :only => [:index, :show] 
end 

Это создает адреса в виде вложенного ресурса лиц, но только делает доступными показания индекса и представления.

+0

Удивительный, Карл, спасибо. Как я объяснил в приведенном выше редактировании, я не использовал блок кода правильно (я хотел указать другие ограничения на: лица, использующие: has_one,: has_many и т. Д., И прибегать к блоку кода только тогда, когда это необходимо). – rmk

 Смежные вопросы

  • Нет связанных вопросов^_^