2009-05-27 25 views
2

我有一个允许属性为null的模型,但是当读取null属性时,我想采取特殊的操作。特别是,我想抛出一些例外。也就是说,就像如何包装所有ActiveRecord属性访问器

class MyModel < ActiveRecord::Base 
    def anAttr 
     read_attribute(:anAttr) or raise MyException(:anAttr) 
    end 
end 

这一切都很好,但这意味着我必须为每个属性手动编码相同的自定义访问器。

我想我可以重写read_attribute,但是我的覆盖的read_attribute从来没有被调用过。

+1

我真的要问为什么。你在这里的用例是什么?当然有更好的方法。 “例外情况是出于特殊情况。”无似乎并不罕见。 – 2009-05-28 04:33:50

回答

4

不知道为什么你需要做到这一点,但很可惜:

def get(attr) 
    val = self.send(attr) 
    raise MyException unless val 
    val 
end 

@object.get(:name) 
1

这很有趣,我们今天看这个同样的事情。检查attribute_method.rb这是属性存在的所有Rails逻辑的位置。你会看到一个define_attribute_methods方法,你应该可以覆盖。最后,我认为我们将以不同的方式做到这一点,但这是一个有益的练习。