目前,用户可以创建多个帐户并为每个帐户使用相同的 paypal_email。
我试图将每个用户限制为一个唯一的 paypal_email。我不想使用 :uniqueness => true 因为在某些情况下管理员可以允许用户拥有多个帐户(因此共享 1 个 paypal_email)。
为了将每个用户限制为 1 个唯一的 paypal_email,我在用户模型中设置了一个名为 :warning 的字段。如果 :warning 设置为“已接受”,则该 paypal_email 的用户模型中不应有重复项。如果 :warning 是“禁止”,那么提交的 paypal_email 应该被拒绝。当 :warning 为“警告”时,它会被忽略。
ReviewPayments 控制器在用户提交他们的 paypal_email 时验证 paypal_email(ReviewPayments 模型中的重复 paypal_email 字段,如果有效,则复制到 Users 模型中)。ReviewPayment 模型属于Reviews 模型,Reviews 模型属于Users 模型。(例如,ReviewsPayment << 评论 << 用户)。所以我应该能够在 ReviewPayment 控制器中引用用户模型字段(如 :paypal_email 和 :warning),对吗?我不认为它有效。我的控制器代码如下:
在测试(临时站点)中,当我提交被禁止的 paypal_email(即:warning == "Banned")时,duplicate_paypal?方法返回true而不是banned_paypal?方法。事实上,当我输入用户数据库中已经存在的任何 paypal_email 时,它会通过 duplicate_paypal 方法被拒绝。如果我输入一个全新的 paypal_email,它就会通过。似乎 .where 条件设置不正确。这意味着我没有正确引用 User 模型。
帮助?
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