2017-07-26 7 views
0

私は2つのクラスを持ち、どちらもOAuth 2ベアラアクセストークンを使用して同じサーバへのAPIコールを行います。私はこれらのクラスの両方からActiveRecordのコールバック機能を簡単に利用できるように、API関連のコードをモジュールにまとめようとしています。 コールクラスのデータにアクセスする方法(またはコールバックでパラメータとして渡す必要がある場合)を説明する場所が見つかりません。アクセスクラス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(M:Moduleの未定義メソッド 'id '):' より具体的には、クラスに含まれる別のモジュール内にネストされたモジュールがあります –

+0

JFYI、インデント用のRubyコミュニティ標準は2つのスペースです。 –

答えて

0

ModuleAのインスタンスメソッドのすべてをClassBを与えます。メソッドはClassBの他のインスタンスメソッドのいずれとも変わりません。それらを同じ方法(b = ClassB.new; b.a_method)と呼び、メソッドselfはメソッドを呼び出すClassBのインスタンスになるため、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" 

ネストされた2つのモジュールは、同じメソッド名の異なる定義を持っている必要がありますので、あなたは、どちらか一方だけを含めたいです。あなたは構文でそうする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

selfmy_methodに入れると、Cのインスタンスになります。したがって、C自体のメソッドであるかのように、通常は属性にアクセスするだけです。

「現在 self」の概念を理解する
module M 
    def my_method 
    print("id: #{id}") 
    print("fname: #{f_name}") 
    print("lname: #{l_name}") 
    print("address: #{address}") 
    end 
end 

とどのように異なる(モジュールを含む、instance_eval、など)構築物は、それに影響を与え、Rubyで何か良いになるための非常に重要です。彼らはClassBで直接定義されていたかのようにClassBModuleA含める

+0

モジュールメソッドが他のモジュールの内部にネストされているかどうかは重要ですか? 「( プリント プリント( "FNAME:#{F_NAME}") プリント( "#{L_NAME} LNAME"): 'モジュールM モジュールNは DEF プリント( "#{ID} ID")をmy_methodアドレス:#{アドレス} ") 終了 終了 終了' –

+0

@BryanGurneyこのコードは読めません。しかし、それを試してみてください。 –

+1

@BryanGurneyそれから、 'M'の中に' include N'を入れ、 'C'は' M'を含むクラス/モジュールと同じように 'C'を、' C'の中には ' 'include M :: N' –

関連する問題