2016-03-05 175 views
0

启发由DataMapper的使用混入怎么样,我需要了解如何复制使用混入以下红宝石混入物业

module Property 
    def property(name, type, value) 
    #Some code 
    end 
end 

class Weapon 
    include Property 

    property :name, :string, "The legendary Sword" 
    property :attack, :integer, 10 
end 

class Item 
    include Property 

    property :name, :string, "Magic Carpet" 
    property :description, :string, "Fly you to the moon" 
end 

但我有一个错误,

NoMethodError: undefined method `property' for Route:Class 

任何帮助是非常赞赏。谢谢。

回答

2

默认情况下,如果include Property位于另一个类中,则所有实例方法都可用作其他类实例的实例方法。

对于您的情况,您可以在另一个类中使用extend Property,因此Property的实例方法将成为另一个类的类方法。

module Property 
    def property(name, type, value) 
    #Some code 
    end 
end 

class Weapon 
    extend Property 

    property :name, :string, "The legendary Sword" 
    property :attack, :integer, 10 
end 

或者如果你喜欢使用include Property,你可以连接模块的included方法,并添加必要的方法存在。

module Property 
    def self.included(clazz) 
    clazz.define_singleton_method(:property) do |name, type, value| 
     p [name, type, value] 
    end 
    end 
end 
+0

阿里嗨, 感谢您详细的解释。 –

+0

@GavinYap没问题:) –

0

所以以下阿里的帖子后,这是我做的

module Item 
    def self.included(item) 
    item.extend Property 
    end   
end 

module Property 
def property(name, type, value) 
    define_method(name) { p [name, type, value] } 
end 

class Weapon 
    include Item 

    property :name, :string, "The legendary Sword" 
    property :attack, :integer, 10 
end