目前,用户可以为每个帐户创建多个帐户并使用相同的paypal_email。
我正在尝试将每个用户限制为一个唯一的paypal_email。我不想使用:uniqueness =>是的,因为在某些情况下,管理员可以允许用户拥有多个帐户(因此共享1个paypal_email)。
要将每个用户限制为1个唯一的paypal_email,我在Users模型中设置了一个名为:warning的字段。如果:warning设置为“Accepted”,那么paypal_email的Users模型中应该没有重复项。如果:警告是“禁止”,则应拒绝提交的paypal_email。何时:警告被“警告”其被忽略。
当用户提交paypal_email时,ReviewPayments控制器会验证paypal_email(ReviewPayments模型中的重复paypal_email字段,如果有效,则会复制到Users模型中)。 ReviewsPayment模型属于Reviews模型,而Review模型属于Users模型。 (例如,ReviewsPayment<< Reviews<< Users)。所以我应该能够在ReviewsPayment控制器中引用用户模型字段(例如:paypal_email和:warning),对吗?我不认为它有效。我的控制器代码如下:
在测试(暂存站点)时,当我提交禁止的paypal_email(即:warning ==“Banned”)时,duplicate_paypal?方法返回true而不是banned_paypal?方法。事实上,当我输入已经在User数据库中的任何paypal_email时,它会被duplicate_paypal方法拒绝。如果我输入一个全新的paypal_email它就会通过。似乎.where条件设置不正确。这意味着我没有正确引用用户模型。
帮助?
class My::ReviewPaymentsController < ApplicationController
before_filter :require_login
before_filter :load_review
before_filter :new_payment
def new
@payment.paypal_email = current_user.paypal_email
end
def create
@payment.payment_type = "PayPal"
@payment.paypal_email = params[:review_payment][:paypal_email]
# if paypal_email is not a duplicate then check to ensure
# it's not a banned user's paypal account
if :duplicate_paypal?
@payment.errors.add(:paypal_email, "This Paypal account is associated with another registered user.
Please provide your own Paypal account.")
render :new
elsif :banned_paypal?
@payment.errors.add(:paypal_email, "This Paypal account is disabled.
Please provide another Paypal account.")
render :new
elsif @payment.save && @review.start_audit
flash[:success] = "Thank you for your review! You will receive your payment shortly."
redirect_to root_path
else
render :new
end
end
def duplicate_paypal
@countdupe = 0
@currentuserid = current_user.reviews.find params[:user_id]
@countdupe = User.where(:warning == "Accepted" && :id != @currentuserid).find_all_by_paypal_email(current_user.paypal_email).count
@countdupe > 0
end
def banned_paypal
@countdupe = 0
@countdupe = User.where(:warning == "Banned").find_all_by_paypal_email(current_user.paypal_email).count
@countdupe != 0
end
protected
def load_review
@review = current_user.reviews.find params[:review_id]
@manuscript = @review.manuscript
end
def new_payment
@payment = ReviewPayment.new
@payment.review = @review
@payment.review_payment_amount = ReviewPayment::RewardAmount
end
end
答案 0 :(得分:0)
在模型中添加验证并查看以下链接:
http://edgeguides.rubyonrails.org/active_record_validations.html#using-a-string-with-if-and-unless
这将立即解决您的问题。获得主要想法:
class User < ActiveRecord::Base
validates :paypal_email, uniqueness: true, if: Proc.new { |u| u.warning == "Banned" }
end
答案 1 :(得分:0)
最好在这里使用条件验证 http://edgeguides.rubyonrails.org/active_record_validations.html#conditional-validation
在你的模型中你可以这样写:
validates :paypal_email, uniqueness: true, if: :warning?
并使用warning属性作为布尔值。