Rails活动模型验证器不接受:on => :创建

时间:2016-01-20 11:04:58

标签: ruby-on-rails ruby validation

我有一个User模型,为此我使用了自定义验证器类,自定义验证器类的代码为

user_validator.rb

class UserValidator
  include ActiveModel::Validations

  attr_accessor :first_name, :last_name, :email, :id
  validates :first_name, :presence => {
                           :message => I18n.t("users.errors.first_name_blank")
                       }
  validates_length_of :first_name, :maximum => 64 , :message => I18n.t("users.errors.first_name_length")

  validates :last_name, :presence => {
                          :message => I18n.t("users.errors.last_name_blank")
                      }
  validates_length_of :last_name, :maximum => 64, message: I18n.t("users.errors.last_name_length")
  validates :email, :presence => {
                      :message =>  I18n.t("users.errors.email_blank")
                  }, format: {
                      with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i,
                      message: I18n.t("users.errors.email_format")
                  }, :on => :create
  validate :email_uniqueness

  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end

  def persisted?
    false
  end

  private

  def email_uniqueness
    if self.id.blank?
      unless User.where(email: email).count == 0
      errors.add(:email, I18n.t("users.errors.email_taken"))
      end
    end
  end
end

我在更新和创建操作中使用的这个自定义验证器类但在更新操作中我没有使用电子邮件验证如何仅在创建时使用电子邮件验证,不幸的是rails不接受:on => :在此创建

4 个答案:

答案 0 :(得分:1)

如果将哈希值传递给验证器选项,那么:on条件必须是哈希值的一部分:

validates :email, 
  presence: {
    message:  I18n.t("users.errors.email_blank"),
    on: :create
  }, 
  format: {
    with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i,
    message: I18n.t("users.errors.email_format"),
    on: :create
  },
  uniqueness: { 
    on: :create 
  }

请参阅文档中的:email example

答案 1 :(得分:0)

您可以执行以下操作:

validates :email, :presence => {
                  :message =>  I18n.t("users.errors.email_blank")
              }, format: {
                  with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i,
                  message: I18n.t("users.errors.email_format")
              }, :if => :new_record?

答案 2 :(得分:0)

如果使用设计使用电子邮件进行身份验证,则无法覆盖它。

     # ==> Configuration for any authentication mechanism
  # Configure which keys are used when authenticating a user. The default is
  # just :email.

您需要将其更改为:用户名或其他内容。 您无法在更新时再次接受相同的电子邮件,设计将不允许您。

答案 3 :(得分:0)

我已经尝试在我的代码中实现验证,并且它的工作绝对正常。

validates :email, :presence => {
                      :message =>  I18n.t("users.errors.email_blank")
                  }, format: {
                      with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i,
                      message: I18n.t("users.errors.email_format")
                  }, :on => :create

我在创建时遇到了这个错误:

2 errors prohibited this admin_about_me from being saved:
Story title translation missing: en.users.errors.email_blank
Story title translation missing: en.users.errors.email_format

并在更新时成功保存。

我认为您还要检查更新时的电子邮件唯一性。

你应该用这个:

validates :email, 
  presence: {
    message:  I18n.t("users.errors.email_blank"),
    on: :create
  }, 
  format: {
    with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i,
    message: I18n.t("users.errors.email_format"),
    on: :create
  }
  validates :email, uniqueness: true

使用以下行创建或更新

validates :email, uniqueness: true, on: :update
validates :email, uniqueness: true, on: :create