2010-07-14 86 views
2

我想創建嵌套的資源,其中的子資源沒有自己的存在。例如鏈接到PersonAddress資源。在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"} 

現在我要確保,一個人的地址是隻讀的,也就是說,我只需要對地址使用showindex操作。

我嘗試這樣做:

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) 

有沒有什麼辦法可以做到這一點?

編輯: 我的主要問題是,我沒有正確使用代碼塊(我想盡可能使用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 2010-07-14 21:16:03