2010-01-07 99 views
4

我是新來的rails,甚至不知道這是否是解決我的情況的正確方法。rails中的屬性和構造函數

我有有一個「的has_many」聯想到「會員」模型中的「俱樂部」 ActiveRecords模型。我想登錄的「俱樂部」,只能夠管理它自己的「會員」,所以在「會員」模型中的每個動作的開始,我做了類似下面的內容:

def index 
@members = Club.find(session[:club_id]).members 

訪問正確的成員。然而,這並不是非常乾燥,因爲我在每次行動中都做了同樣的事情。所以我想到了使用相當於其他語言中稱爲構造函數的東西。我已經理解了它的初始化方法。然而,這不起作用,this告訴我爲什麼,並提出了一個替代方案。 after_initialize。

def after_initialize 
@club = Club.find(session[:club_id]) 
end 

def index 
@members = @club.members 
.... 

似乎無法正常工作。任何指向爲什麼?

You have a nil object when you didn't expect it! 
The error occurred while evaluating nil.members 

讓我覺得@club var沒有設置。

此外,這個解決方案真的很好嗎?這使得很難實施任何可以管理所有俱樂部成員的「超級管理員」。任何想法,我失去了什麼東西?

回答

5

您可以使用before_filter。 在您的ApplicationController中定義過濾器(以便您可以從任何控制器訪問它)。

class ApplicationController < ActionController::Base 

    # .. 

    protected 

    def load_members 
     @members = if session[:club_id] 
     Club.find(session[:club_id]).members 
     else 
     [] 
     end 
    end 

end 

然後,在您需要的任何操作之前加載過濾器。 例如

class ClubController < ApplicationController 
    before_filter :load_members, :only => %w(index) 

    def index 
    # here @members is set 
    end 
end 

否則,使用延遲加載。您可以使用相同的load_members,並在需要時隨時撥打電話。

class ClubController < ApplicationController 
    def index 
    # do something with members 
    load_members.each { ... } 
    end 
end 

當然,你可以自定義load_member引發異常,如果@members.empty?客戶端重定向或做任何你想要的。

+0

很好的迴應。正是我在找什麼。我不明白的一件事是before_filter中的第二個參數。你能否澄清一下「:only =>%w(index)」部分? – 2010-01-08 13:07:40

+0

The:only options指定過濾器只應執行索引操作。 – 2010-01-08 16:45:47

3

你想使用這個before_filter

class MembersController < ApplicationController 

    before_filter :find_club 

    def index 
    @members = @club.members 
    end 

    private 

    def find_club 
     @club = Club.find(session[:club_id]) 
    end 
end 
相關問題