2013-01-17 36 views
0

因此,我正在考慮使用缺少的方法來構建幾個我需要管理的日期時間所需的日期時間方法。元編程中`self.attribute =`的問題Ruby

我立足於瑞安貝茨虛擬屬性這個方法,我相信我有這樣的元編程挑戰下來(我第一個!)不同的是,我還沒有解決的一個小天翻地覆......

對於這部分我的方法,我得到關於這應該是意外的=錯誤...

define_method(save_method) do 
     self.send(attribute) = Chronic.parse(args[0], context: :past) if instance_variable_get("@#{method_name}").present? 
    end 

的方法是應該期待一個) ... ...但是我一直無法理解它出。

def method_missing(method_name, *args) 
    if method_name.to_s.match(/^chronic_(\w+)/) 

     save_method  = "save_#{method_name}" 
     validate_method = "check_#{method_name}" 
     attribute = method_name.to_s.gsub(/^chronic_/, '').to_sym 

     self.class.class_eval do 
     attr_accessible method_name.to_sym 
     attr_writer  method_name.to_sym 
     validate  validate_method.to_sym 
     before_save  save_method.to_sym 

     define_method(save_method) do 
      self.send(attribute) = Chronic.parse(args[0], context: :past) if instance_variable_get("@#{method_name}").present? 
     end 

     define_method(validate_method) do 
      if instance_variable_get("@#{method_name}").present? && Chronic.parse(args[0], context: :past).nil? 
      errors.add :released_at_text, "cannot be parsed" 
      end 
     end 

     define_method(method_name) do 
      instance_variable_get("@#{method_name}") || attribute 
     end 

     end 
     puts attribute 
     send(method_name) 
    else 
     super 
    end 
    end 
+0

你能再指定的方法的一部分,究竟是你的代碼的問題?你想做什麼? –

+0

@SergioTulentsev - 根據下面的zed_0xff答案解決,但仍然有麻煩,你可以在評論中看到。任何提示都會被學習程序員所欣賞。 – ovatsug25

回答

2
define_method(save_method) do 
    self.send("#{attribute}=", Chronic.parse(args[0], context: :past)) if instance_variables.include?("@#{method_name}") 
end 

=」是setter方法名,所以你必須send("#{attribute}=", value)

+0

所以我按照建議進行了更改(謝謝!),它的工作原理!我還改變了「getter」在一元運算符後面有一個'self.send(attribute)'。一切都很順利,除了我得到一個大規模任務安全錯誤...不知道爲什麼... – ovatsug25