私はこの作業を行う方法を見つけましたが、より良い方法やRails 3の方法について興味があります。 (私はまだ2.3.5を使用していますが、新年の周りを移行したいと考えています)複数世代のモジュールでレールバリデーションを定義/アタッチする方法
状況:2つのレイヤーの継承があり、2番目のレイヤーがRailsモデルに混在しています。両方のモジュールは、検証メソッドを定義して、私は、基本クラスに検証を添付し、それらの両方が欲しい、しかしので相続の二つのレベルの、次のように動作しません:
def self.included(base)
base.validate :yadda_yadda
end
そのモジュールが含まれている場合モジュールはActiveRecord::Validations
を知らないので、別のモジュールによってインタープリタが慌てて停止するようになります。検証モジュールを含めると、「save
はどこですか?」という質問が返されます。 alias_method
のおかげです。
validate()
を無効にするたびにsuper
を呼び出すことを忘れない限り、以下のように動作します。私は自分自身や将来のメンテナーがそれを覚えているとは信用しないので、可能であれば、validate :yadda_yadda
イディオムを使用したいと思います。
module Grandpa
def validate
must_be_ok
end
def must_be_ok
errors.add_to_base("#{self} wasn't ok")
end
end
module Dad
include Grandpa
def validate
super
must_be_ok_too
end
def must_be_ok_too
errors.add_to_base("#{self} wasn't ok either")
end
end
class Kid < ActiveRecord::Base
include Dad
validate :must_be_ok_three
def must_be_ok_three
errors.add_to_base("#{self} wasn't ok furthermore")
end
end
提案? Rails 3のアプローチのヒント検証APIがそれほど変わったとは思いません。
複数のモデル間で検証を共有したいと思いますか? – jonnii