2011-03-23 18 views
1

鑑於我有兩種型號:companylocation。 A company有許多locations
我發現Ryan Bates' Named Routes很有意思。
因此,我在routes.rb中爲我的每個模型添加了資源。如何使用命名路由過濾Rails中的列表動作?

resources :companies 
resources :locations 

這使我產生基於像<%= link_to "Companies", companies_path %>導致http://localhost:3000/companies命名路由鏈接。

現在我想根據他們所屬的company過濾locations的列表。在使用命名路線之前,我通過添加如下鏈接來完成此任務。

<%= link_to "Locations for this company", { :controller => 'locations', :action => 'list', :company_id => company.id } %> 

這裏我通過company_id到過濾器在其list動作的位置LocationsController

def list 
    @locations = Location.order("locations.id ASC").where(:company_id => @company.try(:id)) 
end 

回答

2

一個選項:

resources :companies do 
    get :list, :controller => :locations 
    end 

會生成此路線:

company_list GET /companies/:company_id/list(.:format) {:action=>"list", :controller=>"locations"} 

這就爲你提供了一個company_list輔助方法。

然而,這

resources :companies do 
    get :list, :controller => :locations 
    resources :locations 
    end 

請問爲您提供company_locations幫手點,相反,在index行動上,而不是LocationsController的list

company_locations GET /companies/:company_id/locations(.:format)   {:action=>"index", :controller=>"locations"} 

後者更加RESTful,但您是開發人員,因此您可以決定哪個命名可以幫助您更多。

缺點是,您的位置控制器上的大多數操作/幫助器現在都依賴於:company_id或實例化的公司模型附加到它們。

編輯

第三選項:

resources :companies do 
    get :list, :controller => :locations 
end 
resources :locations 

這似乎是最好的,因爲比「company_list」路線外,你沒有權利要求擁有由公司被過濾位置太大必要。

+0

工程!雖然,我有另一個指向'locations_path'的未經過濾的鏈接。它不顯示任何「位置」。這是我在控制器中定義的。我如何確保使用位置控制器的'list'動作來過濾和未過濾的結果? – JJD 2011-03-23 18:34:47

+0

添加了第三條建議。 – nessur 2011-03-28 20:12:32

+1

謝謝。我留在我的第一選擇,因爲我也想創建與公司相關的新地點。我使用'new_company_location_path'來保持關聯。 – JJD 2011-03-28 22:28:37

1

根據您的位置模型需要做什麼,我會建議使用嵌套資源;

resources :companies do 
    resources :locations 
end 

然後做一個耙路線,這將給你各種新的,更好的途徑,如:

公司/ ID /位置

+0

謝謝,我選擇了這個選項。 – JJD 2011-03-23 18:35:46