Rails 3:自定义验证错误消息

5
我不明白为什么以下代码在Rails 3中无法正常工作。我收到了“未定义的局部变量或方法`custom_message'”的错误提示。
validates :to_email, :email_format => { :message => custom_message }

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

我也尝试使用:message => :custom_message,如rails-validation-message-error中所建议的那样,但没有成功。

:email_format是位于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

我可以使用您提供的代码复制您的错误,但是当我按照您建议的更改为 :message => :custom_message 时,错误消失了。 - Dusty
3个回答

2

仅供参考,我认为正在发生的事情是这样的。'validates'方法是一个类方法,即MyModel.validates()。当你将这些参数传递给'validates'并调用'custom_message'时,实际上是在调用MyModel.custom_message。因此,你需要像这样:

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

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

在调用validates之前定义self.custom_message。

1
如果有人感兴趣,我想出了以下解决方案来解决我的问题:
模型:
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
也许需要在验证之前定义“custom_message”方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接