Rails验证可防止保存

时间:2011-04-08 20:12:41

标签: ruby-on-rails validation

我有这样的用户模型:

class User < ActiveRecord::Base
    validates :password, :presence => true,
                         :confirmation => true,
                         :length => { :within => 6..40 }
    .
    .
    .
end

在User模型中,我有一个我想要从OrdersController保存的billing_id列,如下所示:

class OrdersController < ApplicationController
    .
    .
    .
    def create
        @order = Order.new(params[:order])
        if @order.save
            if @order.purchase
                response = GATEWAY.store(credit_card, options)
                result = response.params['billingid']
                @thisuser = User.find(current_user)
                @thisuser.billing_id  = result
                if @thisuser.save
                        redirect_to(root_url), :notice => 'billing id saved')
                    else
                        redirect_to(root_url), :notice => @thisuser.errors)
                    end
            end
        end
    end

由于用户模型中的validates :password@thisuser.save无法保存。但是,一旦我注释掉验证,@thisuser.save将返回true。这对我来说是一个陌生的领域,因为我认为这种验证仅在创建新用户时有效。有人可以告诉我,每当我尝试保存用户模型时,validates :password是否应该启动?谢谢

2 个答案:

答案 0 :(得分:12)

您需要指定何时运行验证,否则它们将在每次save次呼叫时运行。但这很容易限制:

validates :password,
  :presence => true,
  :confirmation => true,
  :length => { :within => 6..40 },
  :on => :create

另一种方法是有条件地进行此验证:

validates :password,
  :presence => true,
  :confirmation => true,
  :length => { :within => 6..40 },
  :if => :password_required?

您可以定义一种方法,指示在认为此模型有效之前是否需要密码:

class User < ActiveRecord::Base
  def password_required?
    # Validation required if this is a new record or the password is being
    # updated.
    self.new_record? or self.password?
  end
end

答案 1 :(得分:0)

可能是因为您确认密码已经确认(:confirmation => true),但密码确认不存在。

你可以将其分解为:

validates_presence_of :password, :length => { :within => 6..40 }
validates_presence_of :password_confirmation, :if => :password_changed?

我喜欢这种方法,因为如果用户更改了密码,则需要用户输入相同的password_confirmation。