使用attr_accessor
方法动态制作设置方法时,是否有更好的方法设置值?我需要这个来为rails中的另一个模型设置它们的值。我正在尝试做类似下面的事情。
Model_class.all.each do |mdl|
attr_accessor(mdl.some_field)
end
然后我知道它创建了一组get和setter方法。我想要做的是,当这些方法被创建时,我想要为setter方法指定一些值。提前谢谢。
答案 0 :(得分:2)
attr_accessor
没有嵌入魔法。对于传递给它的每个参数,它基本上执行类似的东西(代码被简化,缺乏必要的检查等):
def attr_accessor(*vars)
vars.each do |var|
define_method var { instance_variable_get("@#{var}") }
define_method "#{var}=" { |val| instance_variable_set("@#{var}", val) }
end
end
也就是说,attr_accessor :var1, :var2
DSL简单地带来了新的4个普通的好红宝石方法。对于你所问的问题,人们可能会自己定义这些方法(或其中一些方法,或者没有方法)。例如,对于带有支票的繁琐设置,可能会这样做:
attr_reader :variable # reader is reader, no magic
def variable=(val) do
raise ArgumentError, "You must be kidding" if val.nil?
@variable = val
end
以上就像往常一样:
instance.variable = 42
#⇒ 42
instance.variable = nil
#⇒ ArgumentError: You must be kidding