Come inizializzare personalizzato ActiveModel validatori in Rails 3+ app all'interno di un motore di Rails

StackOverflow https://stackoverflow.com/questions/8319751

Domanda

Sto cercando di caricare un po 'personalizzato validatori da un motore di Rails, ma la mia domanda continua a non aver dovuto al validatore non essere riconosciuto.

Qual è il modo corretto e il tempo per inizializzare i validatori nel motore?

Per esempio io ho:

    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

da dentro il mio motori classe Engine < Rails::Engine ho cercato diversi modi per inizializzare i validatori personalizzati come:

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

Ho anche provato il trasferimento di questi in un modulo personalizzato per il carico, ma nessuno di questi metodi sono in fase di inizializzazione / carico correttamente.

Ogni volta che il mio modello di applicazioni viene caricata ricevo Unknown validator: 'NullityValidator'

È stato utile?

Soluzione

La soluzione era incredibilmente più semplice ed elegante di quanto pensassi ... Basta creare una cartella per i vostri config/initializers/ inizializzatori, e rilasciare i validatori lì per essere caricati nell'ordine corretto.

Quindi, solo fatto:

config/initializers/validators.rb

Goccia nel vostro validatore:

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

Allora il vostro bene ad andare. Ho avuto l'impressione che definisce un inizializzatore all'interno railtie engine.rb sarebbe ottenere lo stesso risultato, ma a quanto pare no. Questo è molto più pulito e migliore pratica a mio parere comunque però.

Altri suggerimenti

Sto lavorando su un progetto che ha un email_validator che è stato precedentemente lavorare fino a quando ci siamo trasferiti a un motore montato. Ora si sta dicendo che l'email_validator non può essere trovato. Devo solo copiare la classe e-mail validatore e mettere questo nel config / inizializzatori / validators.rb o c'è un metodo migliore

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top