2010-09-20 7 views
5

Je ne comprends pas pourquoi ce qui suit ne fonctionne pas dans Rails 3. Je reçois une erreur "variable locale non définie ou méthode` custom_message '".Rails 3: message d'erreur personnalisé dans la validation

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

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

J'ai essayé également d'utiliser: message =>: custom_message au lieu comme cela a été suggéré dans rails-validation-message-error après avec pas de chance.

: email_format est un validateur personnalisé qui se trouve dans le dossier 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

Je peux dupliquer votre erreur en utilisant votre code exact, mais quand je le change en ': message =>: custom_message' comme vous l'avez suggéré, l'erreur disparaît. – Dusty

Répondre

1

Si quelqu'un est intéressé je suis venu avec la solution suivante à mon problème:

Modèle:

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

Peut-être que la méthode "custom_message" doit être définie au-dessus de la validation.

1

Juste pour référence, c'est ce que je crois se passe. La méthode 'validates' est une méthode de classe, c'est-à-dire MyModel.validates(). Lorsque vous transmettez ces paramètres à 'validates' et que vous appelez 'custom_message', vous appelez MyModel.custom_message. Donc, vous auriez besoin quelque chose comme

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

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

avec self.custom_message défini avant l'appel à Valide.