1

鉴于我有两个模型:companylocation. Acompany有很多locations
我发现Ryan Bates 的命名路线非常有趣。
所以我为我的每个模型添加了资源routes.rb

resources :companies
resources :locations

这使我能够基于命名路由生成链接,<%= link_to "Companies", companies_path %>例如http://localhost:3000/companies.

现在我想locations根据company它们所属的列表过滤列表。在使用命名路由之前,我通过添加如下链接来完成此操作。

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

在这里,我将 传递company_idLocationsControllerwhich 过滤其list操作中的位置。

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

2 回答 2

2

根据您的位置模型需要做什么,我建议使用嵌套资源;

resources :companies do   
    resources :locations 
end

然后做一个 rake 路线,它会给你各种新的、更好的路线,比如:

公司/身份证/地点

于 2011-03-23T17:40:48.970 回答
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器,它指向indexLocationsController 而不是list.

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

后者更 RESTful,但您是开发人员,因此您可以决定哪种命名对您更有帮助。

不利的一面是,您的 Locations 控制器上的大多数操作/帮助程序现在都依赖于附加 :company_id 或实例化的 Company 模型。

编辑

第三种选择:

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

这似乎是最好的,因为除了“company_list”路线之外,您并没有声称对公司过滤的位置有太多需求。

于 2011-03-23T17:52:50.250 回答