我有一个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 => :在此创建
答案 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