Come inizializzare personalizzato ActiveModel validatori in Rails 3+ app all'interno di un motore di Rails
-
25-10-2019 - |
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'
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