2011-07-08 14 views
2

としても、クラスメソッドを利用可能にする:activesupportの持つモジュールの機能::次のコードを考えると懸念

module Foo 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def foo 
     puts 'foo' 
    end 
    end 
end 

class Bar 
    include Foo 
end 

私は何をしたいのですが、コールFoo.fooの代わりBar.fooです。時には、元のモジュールでクラスメソッドを呼び出すのが自然であると感じることがあります。特に、その機能が含まれているクラスとは関係がなく、元のモジュール名と一緒に記述する方がよい場合があります。

答えて

5

これはコードの匂いのようです。 Fooモジュールをクラスメソッドで拡張することができます:

module Foo 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def foo 
     puts 'foo' 
    end 
    end 

    extend ClassMethods 
end 

class Bar 
    include Foo 
end 

Bar.foo 
Foo.foo 
+0

素晴らしいことに感謝します。なぜコードが匂いがすると思いますか? – kenn

+0

モジュールがクラスメソッドとして定義されているモジュールからモジュール自体を拡張することは正しくないようです。通常、Fooからfooメソッドにアクセスするには、 'Foo :: ClassMethods.foo'を実行します。何も「間違っている」ことはありませんが、これまでに見たパターンではなく、その習慣を身に付けることを推奨しません。 –

+1

@Beerlington:最初の例で 'Foo :: ClassMethods.foo'が動作することは確かですか?私はちょうどテストしたし、それはしなかった(Ruby v2.0)。ありがとう。 – sequielo