Ruby:如何在控制器中引用模型变量?

时间:2013-09-21 21:40:56

标签: ruby-on-rails ruby rails-activerecord

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

2 个答案:

答案 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属性作为布尔值。