我正在尝试自定义活动记录宏。但现在似乎不可能从它的块中设置一个实例变量..这就是我想要做的。
module ActiveRecord
class Base
def self.included(base)
base.class.send(:define_method, :my_macro) do |args|
# instance_variable_set for the model instance that has called this
# macro using args
end
end
end
end
我尝试了class_eval,instance_eval ..但似乎没有任何效果,或者我不知道如何使用它们。
提前致谢。
修改:让我试着更好地解释一下。我有一个班级方法。该类的实例调用此方法。现在,这个类方法应该指示实例为自己设置一个实例变量。
编辑 - 这就是我想要使用宏
的方式class MyModel < ActiveRecord::Base
my_macro(*args)
def after_initialize
# use the value set in the macro as @instance variable
end
end
答案 0 :(得分:0)
这是你在想什么:
class DynamicAdd
def add_method
self.class_eval do
attr_accessor :some_method
end
end
end
然后您可以执行以下操作:
k = DynamicAdd.new
k.some_method = "hi"
会导致未定义的方法错误。
但是,
k = DynamicAdd.new
k.add_method
k.some_method = "hi"
应该有用。
除了attr_accessors之外,您还可以使用相同的格式来定义其他类型的方法:
class DynamicAdd
def add_method
self.class_eval do
def some_method
return "hi"
end
end
end
end
答案 1 :(得分:0)
Hm ..是不是包含()一个模块方法?我认为你不能像你写的那样在课堂上使用它。如果你想创建一个类方法,你可以做
class Base
def self.my_method
end
或
class Base
class << self
def my_method
end
end
如果您只想将实例变量添加到现有对象,那么您可以使用#instance_variable_set
class Base
class << self
def my_method(instance_of_base, value)
instance_of_base.instance_variable_set "@x", value
end
end
end
a = Base.new
a.class.send(:my_method, *[a,4])