2017-07-26 14 views
0

我有兩個類,它們都使用OAuth 2承載訪問令牌對同一服務器進行API調用。我試圖將與API相關的代碼包裝到模塊中,以便我可以輕鬆地從這兩個類中使用ActiveRecord的回調函數。 我找不到描述如何訪問調用類的數據的任何地方(或者如果我必須將它作爲參數傳遞給回調函數)。訪問類從ActiveRecord回調到外部的對象數據模塊

module M 
    BASE_URL = 'www.googleapis.com' 
    TOKEN = *generated oauth token* 
    module N 
    def my_method 
     print("id: #{C.id}") 
     print("fname: #{C.f_name}") 
     print("lname: #{C.l_name}") 
     print("address: #{C.address}") 
    end 
    end 
    module O 
    def my_method 
     #assume this does something different from module N 
     print("id: #{D.id}") 
     print("fname: #{D.f_name}") 
     print("lname: #{D.l_name}") 
     print("address: #{D.address}") 
    end 
    end 
end 

class C 
    include M 
    attr_accessible :id, :f_name, :l_name, :address 
    after_create N::my_method 
end 
class D 
    include M 
    attr_accessible :id, :f_name, :l_name, :address 
    after_create O::my_method 
end 

我該如何去從模塊M的my_method中訪問C類數據?還是我完全脫離基地?

+0

你能澄清這個問題嗎?如果在'C'中包含'M',則'C'實例可以調用'my_method'並有權訪問它們自己的屬性。我不知道我是否理解這個問題 –

+0

我得到一個'NoMethodError(未定義的方法ID爲M:模塊):' 更具體地說,我有一個模塊嵌套在該類中包含的另一個模塊 –

+0

JFYI,紅寶石社區標準的縮進是兩個空格。 –

回答

0

包括ClassBModuleA給人ClassB所有的ModuleA的實例方法,就好像他們已經在ClassB直接定義。這些方法與ClassB的其他實例方法沒有任何區別。您可以用同樣的方式調用它們(b = ClassB.new; b.a_method),並且在方法self內將調用該方法的ClassB實例,因此您可以直接訪問實例作用域內定義的任何其他方法或變量。

如果您有一個嵌套模塊,您可以將它包含在其父代中,然後任何包含該父代的類都可以訪問嵌套模塊的方法。

module A 
    module B 
    def where_am_i 
     "Inside mod B" 
    end 
    end 

    include B 
end 

class C 
    include A 
end 

c = C.new 
c.where_am_i # => "Inside mod B" 

在你的情況下,兩個嵌套的模塊應該有不同的相同方法名稱的定義,所以你只想包括一個或另一個。你這樣做的語法include ParentModule::NestedModule

module M 
    BASE_URL = 'www.googleapis.com' 
    TOKEN = *generated oauth token* 

    module N 
    def my_method 
     print("id: #{id}") 
     print("fname: #{f_name}") 
     print("lname: #{l_name}") 
     print("address: #{address}") 
    end 
    end 

    module O 
    def my_method 
     #assume this does something different from module N 
     print("id: #{id}") 
     print("fname: #{f_name}") 
     print("lname: #{l_name}") 
     print("address: #{address}") 
    end 
    end 
end 

class C 
    include M::N 
    attr_accessible :id, :f_name, :l_name, :address 
    after_create :my_method 
end 

class D 
    include M::O 
    attr_accessible :id, :f_name, :l_name, :address 
    after_create :my_method 
end 
+0

我的問題是我正在使用一種稱爲自我的方法。插入(這是限制範圍的模塊)我相信 –

0

當你像這樣包含它時,那麼my_method中的self將是C的一個實例。因此,您只需正常訪問屬性,就好像它是C本身的一個方法。

module M 
    def my_method 
    print("id: #{id}") 
    print("fname: #{f_name}") 
    print("lname: #{l_name}") 
    print("address: #{address}") 
    end 
end 

理解的「當前self」,以及如何不同的結構(包括模塊,instance_eval等)的概念,影響它,是成爲任何好的紅寶石至關重要。

+0

如果模塊方法嵌套在另一個模塊內,那麼它有關係嗎? '組件M 模塊n DEF my_method 打印( 「ID:#(編號)」) 打印(其中 「fname:#{f_name}」) 打印( 「L-NAME:#{l_name}」) 打印(」地址:#{地址}「) 結束 結束 結束# –

+0

@BryanGurney這段代碼是不可讀的。但是,嘗試一下。 –

+1

@BryanGurney然後你有兩種選擇:'在M中包含N',然後'C'也將包含它(如同包含'M'的任何類/模塊一樣),或者在'C'內部'include M :: N' –