2015-05-13 28 views
0
  • 我想定義一個方法封裝模塊。
  • 它與不同模塊中的方法具有相同的名稱。
  • 當我打電話給我想調用另一個混合在第一個。

代碼:如何在模塊範圍內調用方法

class User 
    include ModuleA 
    include ModuleB 
end 

module ModuleA 
    extend ActiveSupport::Concern 

    included do 
    def hi 
    end 
    end 
end 

module ModuleB 
    extend ActiveSupport::Concern 

    def hi(param) 
    end 

    def say_hi 
    hi(param) 
    end 
end 

錯誤與

ArgumentError: wrong number of arguments (1 for 0) 
# ./app/models/concerns/modulea.rb:16:in `hi' 

軌道4

+1

爲什麼'ModuleB'不使用'included'的塊形式? –

+1

@MichaelKohl:真正的問題是,爲什麼'ModuleA'使用該形式:) –

+0

簡短回答:刪除名稱衝突(即重命名其中一個「hi」方法)。只要它在那裏,_something_將被打破(ModuleA或ModuleB,取決於你首先包含哪一個) –

回答

3

正確的答案將是去除包括在兩個模塊。 實例方法將很樂意包含在沒有包含的塊中。如@Sergio Tulentsev所建議的

class User 
    include ModuleA 
    include ModuleB 
end 

module ModuleA 
    extend ActiveSupport::Concern 

    def hi 
    end 
end 

module ModuleB 
    extend ActiveSupport::Concern 

    def hi(param) 
    end 

    def say_hi 
    hi(param) 
    end 
end 
+0

坦率地說,我會和@Sergio Tulentsev一起去。這是重命名衝突方法名稱。 –

相關問題