2016-03-05 78 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