如何在Rails 4.2自定义验证器中使错误消息可覆盖?

时间:2017-06-14 21:35:44

标签: ruby-on-rails validation ruby-on-rails-4 rails-i18n

我有一个自定义验证器。我希望它提供有用的默认错误消息。但是如果调用者 - 模型 - 使用:message参数来覆盖消息,我希望它能够工作。不幸的是,我似乎将我的验证消息硬编码到我的自定义验证器中,并且不知道如何使其更灵活。

自定义验证器:

class EmailnessValidator < ActiveModel::EachValidator
  EMAIL_REGEXP = /some regexp/

  def validate_each(record, attribute, value)
    return if value.blank?

    unless value.match(EMAIL_REGEXP)
      record.errors.add(attribute, I18n.translate("validators.emailness.error", attribute: attribute))
    end
  end
end

调用它的模型:

validates :email, presence: true, emailness: {
  message: I18n.translate("my_model.email.emailness.error")
}

I18N:

validators:
  emailness:
    error: "This should only be a default error message"
my_model:
  email:
    emailness:
      error: "This is the error message I want"

不幸的是,当我将其连接到控制器和视图时,我看到的错误消息是“这应该只是一个默认错误消息”,而不是“这是我想要的错误消息”。

如何重写我的自定义验证器?

1 个答案:

答案 0 :(得分:1)

因为模型中忽略了选项messages

validates :email, presence: true, emailness: {
  message: I18n.translate("my_model.email.emailness.error")
}

您可以合并options来解决问题:

def validate_each(record, attribute, value)
  return if value.blank?

  unless value.match(EMAIL_REGEXP)
    record.errors.add(attribute,
      I18n.translate("validators.emailness.error", attribute: attribute))
      options.merge!(value: value)) # merge options that you passed
  end
end