0

目前,用户可以创建多个帐户并为每个帐户使用相同的 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_pa​​ypal?方法。事实上,当我输入用户数据库中已经存在的任何 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
4

2 回答 2

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
于 2013-09-21T21:53:07.293 回答
0

最好在这里使用条件验证 http://edgeguides.rubyonrails.org/active_record_validations.html#conditional-validation

在您的模型中,您可以这样写:

validates :paypal_email, uniqueness: true, if: :warning?

并使用警告属性作为布尔值。

于 2013-09-21T21:53:50.953 回答