私はクライアント用のモデルを持っています。新しいクライアントを作成すると、クライアント電子メールでUserが作成されます。アフィリエイトを作成すると同じことが起こります。クライアントとユーザの両方でemailのvalidates_uniqueness_を同時に使用できますか?2つのモデルの電子メールをレールで一度に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'のようになります – Maxence
一部のユーザが存在する場合、またはクライアントとは異なる方法で作成することができます。私はあなたがクライアントを作成する前に(そして両方のモデルで一意性を強制する前に)この電子メールを持っていないことをコントローラにチェックインすることをお勧めします。また、クライアントとユーザの作成を 'transaction'にカプセル化して、同じブロックで行います。 (例えば、クライアントコントローラのアクションを作成する場合) – Maxence
これは、クライアントまたはアフィリエイトの内部でのみ検証されます。クライアントとアフィリエイトの両方がユーザーを作成します。私の問題は、一部のアフィリエイトがクライアントに対して同じ電子メールを使用しようとし、ユーザーが既に存在するためにクライアントが保存されますが、ユーザーが既に存在するためにエラーが発生することです。したがって、ユーザーまたはアフィリエイトが作成される前に、そのメールのユーザーが存在するかどうかを確認する必要があります。 – Allan