2012-04-15 23 views
17

私は、ApplicationHelperモジュールの中にモジュールの内部に構築したメソッドのいくつかを含んだ、Rails用の小さなプログラムを作っています。ここでは例です:モジュールをRubyの別のモジュールから継承させる

module Helper 
    def time 
     Time.now.year 
    end 
end 

module ApplicationHelper 
    # Inherit from Helper here... 
end 

私はApplicationHelper < Helperinclude Helperは、クラスのコンテキストで動作するということを知っていますが、モジュール間継承のために何を使うのでしょうか?ありがとう。

答えて

22

実際には、のモジュールを別のモジュールの内部に定義し、次ににはを外側のモジュールに含めます。

so ross$ cat >> mods.rb 
module ApplicationHelper 
    module Helper 
    def time 
     Time.now.year 
    end 
    end 
    include Helper 
end 

class Test 
    include ApplicationHelper 
    def run 
    p time 
    end 
    self 
end.new.run 
so ross$ ruby mods.rb 
2012 
+0

私は他のモジュールの中でモジュールを使用することは考えていませんでした。 – beakr

+7

私はApplicationHelper内のヘルパーがグローバルコードから隠す以外に何を宣言しているのか分かりません。重要なことは、モジュールとクラスの両方で「インクルード」(および「拡張」)が機能することです。 –

1

一つの潜在的落とし穴が含まれるモジュールは、クラスメソッドを取り付ける場合には、これらの方法は、間違った物体に取り付けることができるということです。

場合によっては、 'parent'モジュールを直接ベースクラスに組み込み、新しいメソッドを含む別のモジュールを組み込む方が安全な場合があります。例えば

module ApplicationHelper 
    def self.included(base) 
    base.class_eval do 
     include Helper 
     include InstanceMethods 
    end 
    end 

    module InstanceMethods 
    def new_method 
     #.. 
    end 
    end 

end 

include Helperは、メソッドの定義の後に実行されるように、新たな方法は、彼らがHelperによって上書きさせる、ApplicationHelperで直接定義されていません。別の方法として、class_evalブロック内のメソッドを定義することができます

+0

ここではメソッド定義の中にインクルードステートメントがありますが、これは正しい方法ではないでしょう...これはメソッド定義の内部にインクルードすることに対する警告です。インクルードは、DigitalRossの回答のようにメソッド定義の外にある必要があります – emery

関連する問題