我有一个模型,其中允许属性为null,但是当读取null属性时,我想采取特殊操作。特别是,我想抛出一定的例外。就是这样的事情
class MyModel < ActiveRecord::Base
def anAttr
read_attribute(:anAttr) or raise MyException(:anAttr)
end
end
这一切都很好,但这意味着我必须为每个属性手动编写相同的自定义访问器。
我以为我可以覆盖read_attribute,但是我的覆盖read_attribute永远不会被调用。
答案 0 :(得分:4)
不确定为什么你需要这样做,但唉:
def get(attr)
val = self.send(attr)
raise MyException unless val
val
end
@object.get(:name)
答案 1 :(得分:1)
这很有趣,我们今天也在研究同样的事情。检查attribute_method.rb
,其中存在属性的所有Rails逻辑。您会看到一个define_attribute_methods
方法,您应该可以覆盖它。
最后,我认为我们将以不同的方式做到这一点,但这是一个有益的练习。