2012-10-18 7 views
9

私はRuby on Rails 3.2.2を使用しています。私はモジュールを実装しており、RoR ActiveSupport::Concern機能を使用してクラスに含めています。モジュールが含まれているクラスのクラスコンテキストで実行されるブロック作成コードがincluded do ... endで利用可能になります。`include do ... end`ブロックには何を含めるべきですか?

私の疑いがある:私はincluded do ... endブロックに含める何をしていないでしょうか?それは、例えば、次のような "一般的な"/"良い"練習ですか?

module MyModule 
    extend ActiveSupport::Concern 

    class MyModuleClass 
    attr_accessor :attr1, :attr2, :attr3 

    def initialize(attrs) 
    @attr1 = attrs[:attr1] 
    @attr2 = attrs[:attr2] 
    @attr3 = attrs[:attr3] 
    end 
    end 

    included do 
    @my_module_class = MyModuleClass.new(some_attrs) 
    end 
end 

よりは、BTW MyModuleのを含むクラスの属性として利用できる@my_module_class変数になります:私は以来MyModuleのみ内部@my_module_classが「見える」ようにしたいと思いますそのモジュールでのみ使用されることを意図しています)?上記のコードのincluded do ... endブロックでインスタンス化しようとしているような状況を処理する方法に関するいくつかの「高度な」例やチュートリアルはありますか?何について助言していますか?

答えて

2

@my_classは、MyClassのインスタンスであり、MyModuleではありません。 MyClassのすべてのインスタンスをMyModuleのインスタンスにしたい場合は、次のように記述する必要があります。

クラス定義内に記述する必要があります。

私はあなたが編集される前に、この質問のオリジナル版を見ると意味があると思います。

EDIT 1:

のは、あなたの例にに追加してみましょう、あなたがfooというクラスを持っていると言う:

class Foo 
    include MyModule 
end 

あなたはFooのが、それに関連付けられているMyModuleClassのインスタンスを作成したいですFooを修正したり、MyModuleClassへのアクセス権を与えたりしたくないと思うようです。私はあなたがハッシュテーブルを使用することを提案する:

module MyModule 
    # ... 

    @hash = {} 
    class << self 
     attr_accessor :hash 
    end 

    included do 
     MyModule.hash[self] = MyModuleClass.new(some_attrs) 
    end 
end 

私はそれがうまくいくと思うし、それがFooクラスオブジェクトへのインスタンス変数を追加避けることができます。技術的には、ルビコードのどの部分もMyModule.hashにアクセスすることができますが、ソースコードにコメントを入れてはいけません。ハッシュが存在することを宣伝しないでください。

+0

ありがとうございますが、「主な」質問は「含まれているdo ... end'ブロックにはどうしたらいいですか?私の場合に*、例えば*を関連付ける。それは私にとって非常に重要であっても、残りは「もっと」です。しかし、私は 'MyModuleClass'のすべてのインスタンスを' MyModule'のインスタンスにしたいのではなく、それらを 'MyModule'の内部でのみ利用できるようにします。さらに、モジュールがクラスに含まれることが意図されているので、クラス定義内の 'include MyModule'ステートメントは暗黙的/明白です。 – user12882

+0

"私はどうしたらいいですか"という質問はあまりにも漠然としていますが、質問している問題を解決しようとしている私の「編集1」を見てください。 –

関連する問題