2010-09-20 10 views
5

No entiendo por qué lo siguiente no funciona en Rails 3. Me aparece el error "variable local indefinida o error` custom_message '".Rails 3: mensaje de error personalizado en la validación

validates :to_email, :email_format => { :message => custom_message } 

def custom_message 
    self.to_name + "'s email is not valid" 
end 

También probé usando: message =>: custom_message en cambio, como se sugirió en rails-validation-message-error posterior sin suerte.

: email_format es un validador personalizado ubicado en la carpeta lib:

class EmailFormatValidator < ActiveModel::EachValidator 
    def validate_each(object, attribute, value) 
    unless value =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i 
     object.errors[attribute] << (options[:message] || 'is not valid') 
    end 
    end 
end 
+0

Puedo duplicar el error usando su código exacto, pero cuando lo cambio a ': message =>: custom_message' como sugirió, el error desaparece. – Dusty

Respuesta

1

Si alguien está interesado me ocurrió con la siguiente solución a mi problema:

Modelo:

validates :to_email, :email_format => { :name_attr => :to_name, :message => "'s email is not valid" } 

lib/email_format_validator.rb:

class EmailFormatValidator < ActiveModel::EachValidator 

    def validate_each(object, attribute, value) 
    unless value =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i 

     error_message = if options[:message] && options[:name_attr] 
     object.send(options[:name_attr]).capitalize + options[:message] 
     elsif options[:message] 
     options[:message] 
     else 
     'is not valid' 
     end 

     object.errors[attribute] << error_message 
    end 
    end 
end 
0

Quizás el método "mensaje_personalizado" deba definirse antes de la validación.

1

Solo como referencia, esto es lo que creo que está sucediendo. El método 'validates' es un método de clase, es decir, MyModel.validates(). Cuando pasa esos parámetros a 'valida' y llama 'mensaje_personalizado', en realidad está llamando a MyModel.custom_message. Por lo tanto, necesitaría algo como

def self.custom_message 
    " is not a valid email address." 
end 

validates :to_email, :email_format => { :message => custom_message } 

con self.custom_message definido antes de la llamada a validar.

Cuestiones relacionadas