2012-01-10 50 views
0

我在我的項目之一加載ActiveModel使用,我想請問什麼是明年的情況定義動態方法的最佳途徑在加載ActiveModel實例方法dymamic對象

加載ActiveModel基類只有1訪問屬性稱爲屬性。

def initialize(attributes = {}) 
     set_default_attributes! 
     @attributes.merge!(attributes.symbolize_keys) 
     @new_record = true  
    end 

    def read_attribute_for_validation(key) 
     @attributes[key] 
    end 


    def self.create(attributes={}) 
    obj = self.new(attributes) 
    obj.save 
    return obj 
    end 

    def save 
    if self.valid? 
     puts "saved!" 
     return true 
    end 
    return false 
    end  


    def update_attributes(attributes={}) 
    self.attributes.merge!(attributes.symbolize_keys) 
    self.save 
    end  



    def as_json(options={}) 
     hash = Hash.new 
     hash.merge!(self.attributes) 
     hash.as_json({:root=>false}.merge!(options || {})) 

    end 

方法應該是這樣的存取,但應使用內部@屬性變量

實施例如果是@attributes散列像{:param1=>1,:param2=>2}

實例對象應具有下一個方法

param1 
param1= 
param2 
param2= 

我試圖使用方法丟失,但如果方法完成「=」我需要解析它並檢查這樣的密鑰的屬性,所以我不喜歡代碼的樣子。

+0

添加方法?這應該是一個正則表達式容易。 – phoet 2012-01-10 19:36:06

+0

我可以做到這一點,但我想使用define_method使它更ruby方式 – Fivell 2012-01-10 21:31:15

+0

我不認爲它是使用define_method「更ruby方式」,但它有什麼問題呢?去做就對了?! – phoet 2012-01-11 07:44:15

回答

1

你爲什麼不帶遠離所述方法名的=與singleton_class.module_eval

def initialize(attributes = {}) 
    set_default_attributes! 
    @attributes.each do |key,value| 
    singleton_class.module_eval do 
     define_method(key) { self.attributes[key] } unless method_defined? key 
     define_method("#{key}=") { |new_value| self.attributes[key] = new_value } unless method_defined? "#{key}=" 
    end 
    end 
    @attributes.merge!(attributes.symbolize_keys) 
    @new_record = true 

end 
相關問題