我在Ruby on Rails 3項目中做了一個嵌套路由。用下面的路由:判斷一個控制器是否在Rails 3的嵌套路由中使用
resources :companies do
resources :projects
end
現在我可以通過example.com/projects/id或example.com/companies/id/projects/id獲得該項目位指示的指數方法,但兩個網頁中顯示準確同樣的方式。如何更改第二個示例中的項目頁面以僅顯示與該公司關聯的項目?
我在Ruby on Rails 3項目中做了一個嵌套路由。用下面的路由:判斷一個控制器是否在Rails 3的嵌套路由中使用
resources :companies do
resources :projects
end
現在我可以通過example.com/projects/id或example.com/companies/id/projects/id獲得該項目位指示的指數方法,但兩個網頁中顯示準確同樣的方式。如何更改第二個示例中的項目頁面以僅顯示與該公司關聯的項目?
我會改變你如何範圍的發現。 Rails 3非常漂亮,可以讓你做到這一點,因爲幾乎所有東西都是可以範圍的。
首先在你的控制器我使用像這樣的尋父資源:
before_filter :find_company
# your actions go here
private
def find_company
@company = Company.find(params[:company_id]) if params[:company_id]
end
這應該是相當簡單的:找到具有相匹配的一個從嵌套在傳遞了ID的Company
記錄路線。如果它沒有嵌套,那麼將不會是params[:company_id]
,因此不會有@company
變量集。
接下來,您要根據是否設置@company
來查找項目範圍。這也很簡單。權下的第一個before_filter
,把這個一個:
before_filter :scope_projects
然後爲它定義的方法find_company
方法是這樣的下面:
def scope_projects
@projects = @company ? @company.projects : Project
end
現在你可能在想「哇」。我知道。我也是。
現在無論您參考的是projects
關聯還是Project
類別,都可以使用@projects
代替。通過這種方法的力量,您的應用程序將知道您是否意指「指定公司中的所有項目,永遠」或「所有項目」。
現在,當你的意見,你可以做這樣的事情:
<h1><% if @company %><%= @company.name %>'s<% end %> Projects</h1>
你甚至可以將它移動到一個幫手:
def optional_company
if @company
@company.name + "'s"
end
end
而且把那個醜陋的大塊-O-邏輯代碼如下:
<h1><%= optional_company %> Projects</h1>
根據需要進行修改。
希望這對我有幫助。
隨着inherited_resources電源就可以有可選的嵌套有以下控制器:
class ProjectsController < InheritedResources::Base
belongs_to :company, :optional => true
end
謝謝!奇蹟般有效。 – GSto 2010-11-08 01:24:47