【发布时间】:2017-12-13 23:30:19
【问题描述】:
我有一个客户端模型,当我创建一个新客户端时,它会使用客户端电子邮件创建一个用户。当我创建会员时也会发生同样的事情。我可以同时在客户端和用户中使用 validates_uniqueness_of 电子邮件吗?
或者我应该做一些类似的事情,在保存之前检查是否有用户使用相同的电子邮件,然后打印错误?
我试过了,还是不行
validate :uniqueness_of_user
private
def uniqueness_of_user
@user = User.find_by_email(:email)
if @user.present?
errors.add(:email, "Bang!")
end
end
编辑:
这是控制器:
def create
@affiliate = Affiliate.new(affiliate_params)
respond_to do |format|
if verify_recaptcha(model: @affiliate) && @affiliate.save
@user = User.create!(user_parameter)
pplicationMailer.confirmation(@affiliate).deliver_now
format.html {redirect_to :back, notice: 'Thanks for your submission, we will be in touch shortly. Check your email for your affiliate number and password.' }
format.json { render :show, status: :created, location: @affiliate }
else
format.html { render :signup, layout: "sign-ups" }
format.json { render json: @affiliate.errors, status: :unprocessable_entity }
end
end
end
【问题讨论】:
-
有一个唯一性验证器。你不需要自己写。此外,如果用户只能通过客户端创建,您也不需要在那里强制执行(无论如何都不会受到伤害)。验证看起来像
validates :email, uniqueness: true -
如果某些用户已经存在,或者可以不同于客户端创建。我建议您在创建客户端之前在控制器中检查用户没有此电子邮件(并且仍然在两个模型中强制执行唯一性)。还将客户端和用户创建封装到
transaction中,并在同一个块中进行。 (例如在客户端控制器的创建操作中) -
仅在客户或附属公司内部验证。客户和附属公司都创建了一个用户。我的问题是一些附属公司会尝试为客户使用相同的电子邮件,并且由于用户已经存在,客户将被保存,但会出现错误,因为用户已经存在。因此,在创建用户或会员之前,我需要检查使用该电子邮件的用户是否存在
-
可以通过两种方式创建用户。然后检查我的第二个选项。在创建之前,您必须检查用户中是否存在电子邮件。 (或者您不这样做:如果您强制执行唯一性,它将失败,您可以要求访问者提交另一封电子邮件)。只需确保在同一个
transaction块中创建两个客户端/用户:如果创建用户失败,则不会创建客户端。 -
我用创建操作编辑了问题