2009-05-27 13 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

私は本当になぜ尋ねる必要があります。ここであなたのユースケースは何ですか?確かに良い方法があります。例外は例外的な状況です。 Nilはほとんど例外的ではないようです。 –

+1

それは合理的な質問ですが、私はここで説明する余地があまりありません。一言で言えば、多くのオプションフィールドを持つフォームがあります。提出時には、フォームに対して一連の規則を適用したいと考えています。ルールごとに、「はい」、「いいえ」、または「不十分な情報」のいずれかが表示されます。 それだけでは、「例外によるアボート」メソッドは推奨されません。しかし、我々はまた、可能な限りシンプルでなければならないDSLまたはソートで、ルールを外部に保存します。したがって、ルールそのものの言語はnullをチェックできません。代わりに、ルールは値を使用するだけで、未定義の値へのアクセスがあれば評価が中止されます。 –

答えて

4

わからない、悲しいかな:

おかしい
def get(attr) 
    val = self.send(attr) 
    raise MyException unless val 
    val 
end 

@object.get(:name) 
1

、今日はこれと同じことを検討していました。属性のすべてのRailsロジックが存在する場所であるattribute_method.rbにチェックインしてください。上書きすることができるdefine_attribute_methodsメソッドが表示されます。

最後に、私たちはこれを別のやり方で行うつもりだと思っていますが、それは参考になりました。

関連する問題