3

Railsエンジンからいくつかのカスタムバリデーターを読み込もうとしていますが、バリデーターが認識されないため、アプリケーションが失敗し続けます。

エンジンのバリデーターを初期化する適切な方法と時間は何ですか?

たとえば、私は持っています:

    class NullityValidator < ActiveModel::EachValidator
      # Validates whether <tt>value</tt> is <tt>nil?</tt>.
      def validate_each(record, attribute, value)
        record.errors.add(attribute, :not_nil) unless value.nil?
      end
    end

エンジンクラス内から、Engine < Rails::Engine次のようなカスタムバリデーターを初期化するためのいくつかの異なる方法を試しました。

config.before_initialize do
  class NullityValidator < ActiveModel::EachValidator
  end
end

config.after_initialize do
  class NullityValidator < ActiveModel::EachValidator
  end
end

initializer 'ab_gem.validators' do |app|
  ActiveSupport.on_load :active_model do
    class NullityValidator < ActiveModel::EachValidator
    end
  end
end

initializer 'ab_gem.validators' do |app|
  ActiveSupport.on_load :active_record do
    class NullityValidator < ActiveModel::EachValidator
    end
  end
end

initializer 'ab_gem.validators' do |app|
  class NullityValidator < ActiveModel::EachValidator
  end
end

また、これらをカスタムモジュールに移動してロードしようとしましたが、これらのメソッドのいずれも正しく初期化/ロードされていません。

アプリケーションモデルがロードされているときはいつでも、Unknown validator: 'NullityValidator'

4

2 に答える 2

4

解決策は私が思っていたよりも信じられないほどシンプルでエレガントでした...config/initializers/イニシャライザー用のフォルダーを作成し、そこにバリデーターをドロップして適切な順序でロードするだけです。

だからちょうど作られた:

config/initializers/validators.rb

バリデーターをドロップします。

class NullityValidator < ActiveModel::EachValidator
  # Validates whether <tt>value</tt> is <tt>nil?</tt>.
  def validate_each(record, attribute, value)
    record.errors.add(attribute, :not_nil) unless value.nil?
  end
end

その後、あなたの良い行きます。私はあなたのengine.rbrailtie内でイニシャライザーを定義することで同じことを達成できるという印象を受けましたが、明らかにそうではありません。とにかく、これは私の意見でははるかにクリーンでより良い実践です。

于 2011-12-01T19:47:28.290 に答える
-2

マウントされたエンジンに移動するまで以前は機能していたemail_validatorがあるプロジェクトに取り組んでいます。これで、email_validatorが見つからないと言っています。電子メールバリデータークラスをコピーして、これをconfig / initializers / validators.rbに配置する必要がありますか、それともより良い方法がありますか?

于 2012-04-24T15:28:23.603 に答える