2017-07-26 2 views
0

Ich habe zwei Klassen, beide API-Aufrufe an den gleichen Server mit einem OAuth 2 Bearer Access Token. Ich versuche, den API-bezogenen Code in ein Modul einzubinden, damit ich die Callback-Funktionalität von ActiveRecord aus diesen beiden Klassen einfach nutzen kann. Ich kann nirgends finden, dass beschreibt, wie auf die Daten der aufrufenden Klasse zuzugreifen (oder wenn ich es als ein Parameter mit dem Rückruf übergeben muss).Access Classes Objekt Daten von ActiveRecord Callback zu externen Modul

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 

Wie würde ich mich über die Klasse C die Daten aus Modul M my_method zugreifen? Oder bin ich komplett von der Basis entfernt?

+0

Können Sie das Problem klären? Wenn Sie "M" in "C" einfügen, können 'C' Instanzen' my_method' aufrufen und haben Zugriff auf ihre eigenen Attribute. Ich weiß nicht, ob ich die Frage verstehe –

+0

Ich bekomme ein 'NoMethodError (undefinierte Methode 'id' für M: Module): ' Genauer gesagt, habe ich ein Modul in einem anderen Modul geschachtelt, das in der Klasse –

+0

JFYI enthalten ist, Ruby Community Standard für den Einzug ist zwei Leerzeichen. –

Antwort

0

Einschließlich ModuleA in ClassB gibt ClassB alle ModuleA ‚s Instanzmethoden, als ob sie in ClassB direkt definiert worden war. Die Methoden unterscheiden sich nicht von anderen Methoden der Instanz ClassB. Sie rufen sie auf die gleiche Weise (b = ClassB.new; b.a_method) auf, und innerhalb der Methode self wird die Instanz ClassB, die die Methode aufruft, so dass Sie direkten Zugriff auf alle anderen Methoden oder Variablen innerhalb der ClassB Instanz Bereich haben.

Wenn Sie ein verschachteltes Modul haben, können Sie es in das übergeordnete Modul einschließen, und dann hat jede Klasse, die das übergeordnete Element enthält, Zugriff auf die Methoden des verschachtelten Moduls.

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" 

In Ihrem Fall die beiden verschachtelten Module sollten unterschiedliche Definitionen der gleichen Methode Namen haben, so dass Sie nur eine oder das andere schließen. Sie tun dies mit der Syntax 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

Mein Problem war ich benutzte eine Methode namens Self.einfügen (was den Umfang auf das Modul beschränkte) glaube ich –

0

Wenn Sie es so einschließen, wird self in my_method eine Instanz von C. sein. Und so greifen Sie nur auf die Attribute normalerweise zu, als ob es eine Methode in C selbst war.

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

das Konzept der „aktuellen self“ und wie verschiedene Konstrukte (einschließlich eines Moduls, instance_eval, etc.) zu verstehen beeinflussen es von entscheidender Bedeutung ist in Ruby etwas Gutes für immer.

+0

Ist es dann wichtig, ob die Modulmethode innerhalb eines anderen Moduls verschachtelt ist? 'Modul M Modul N my_method def print ("ID: # {id}") print ("fname: # {f_name}") print ("lname: # {L_NAME}") print (“ Adresse: # {Adresse} ") Ende Ende Ende' –

+0

@BryanGurney Dieses Stück Code ist nicht lesbar. Aber probier es aus. –

+1

@BryanGurney Dann hast du zwei Möglichkeiten: 'schließe N' innerhalb von' M' ein, und dann wird 'C' es auch haben (so wie jede Klasse/Modul die' M' enthält), oder innerhalb 'C' kannst du 'include M :: N' –

Verwandte Themen