2010-11-08 50 views
5

我在Ruby on Rails 3項目中做了一個嵌套路由。用下面的路由:判斷一個控制器是否在Rails 3的嵌套路由中使用

resources :companies do 
    resources :projects 
end 

現在我可以通過example.com/projects/id或example.com/companies/id/projects/id獲得該項目位指示的指數方法,但兩個網頁中顯示準確同樣的方式。如何更改第二個示例中的項目頁面以僅顯示與該公司關聯的項目?

回答

10

我會改變你如何範圍的發現。 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> 

根據需要進行修改。

希望這對我有幫助。

+0

謝謝!奇蹟般有效。 – GSto 2010-11-08 01:24:47

1

隨着inherited_resources電源就可以有可選的嵌套有以下控制器:

class ProjectsController < InheritedResources::Base 
    belongs_to :company, :optional => true 
end