2016-04-27 19 views
0

module Bを含むclass Aのユースケースがあります。クラスからの組み込みモジュールの呼び出しメソッド

class A 
    include B 

    def do_one_thing 
    # override module's method. do something different instead 
    end 

    def do_another_thing 
    # Call `do_one_thing` from here, 
    # but call the module's method, not the one I overrode above. 
    end 
end 

module B 
    included do 
    def do_one_thing 
     # ... 
    end 
    end 

    # some other methods 
end 

上記のように、私はdo_another_thingからdo_one_thingを呼んでいます。私の問題は、モジュールのメソッド(つまりsuperメソッド)を呼び出す必要があることです。これはRailsでも可能ですか?

+1

可能な重複の前に含ま方法を '保存' することができます(http://stackoverflow.com/questions/2597643/ruby-super-keyword ) – Hamms

答えて

1

プロパティにincludedメソッドを使用する場合は、Bモジュールをextend ActiveSupport::Concernに設定する必要がありますが、これで目的の動作が得られません。

私があなただったら、私はそのパターンを放棄して、単純なネイティブのRubyのモジュールパターンを使用したい:

module B  
    def do_one_thing 
    puts 'in module' 
    # ... 
    end 

    # some other methods 
end 

class A 
    include B 

    def do_one_thing 
    super 
    puts 'in class' 
    # override module's method. do something different instead 
    end 

    def do_another_thing 
    do_one_thing 
    # Call `do_one_thing` from here, 
    # but call the module's method, not the one I overrode above. 
    end 
end 

A.new.do_one_thing 

上記のコードは正しくあなたが探しているモジュールの継承を使用します。

Read more about Ruby module inheritance here

+0

ありがとう!そして、私の遅い答えには申し訳ありません。この問題は、(クラスのメソッドを実行しないで)モジュールのメソッドだけを呼び出す必要があることです。他の場面では、モジュールのメソッドを実行せずに、クラスメソッドのみを呼び出す必要があります。 –

+0

いくつかのオプションがあります。あなたが本当に欲しいように聞こえるのは、別の場所で呼び出すことができる2つの方法です。これで十分でない場合は、詳細を使用することがあります。洗練されたものはサルのパッチに似ていますが、はるかに限定された影響範囲を持っています。 Ruby Refinements(http://jakeyesbeck.com/2015/12/13/ruby-refinements/)に関する便利な紹介文を投稿しました。 – yez

0

あなたは[ルビーsuperキーワード]のオーバーライド

module B 
    extend ActiveSupport::Concern 

    included do 
    def do_one_thing 
     puts 'do_one_thing' 
    end 
    end 
end 

class A 
    include B 

    alias_method :old_do_one_thing, :do_one_thing 
    def do_one_thing 
    puts "I'd rather do this" 
    end 

    def do_another_thing 
    old_do_one_thing 
    end 
end 

a= A.new 
a.do_one_thing 
a.do_another_thing 
関連する問題