所以我正在考虑使用缺少的方法来构建我需要管理的大量日期时间所需的几个日期时间方法。
我将此方法基于Ryan Bates的虚拟属性并且相信我有这个元编程挑战(我的第一个!),除了一个我还没有解决的小麻烦...
对于我方法的这一部分,我收到一个关于=
的错误,这应该是意料之外的......
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 :(得分: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)