Rails - 更新操作忽略验证

时间:2013-06-17 23:21:24

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个应用程序,其中包含用于创建帐户的验证密码。但是,当用户更新其密码时,它会忽略所有验证。

用户控制器

    class User < ActiveRecord::Base
      attr_accessible :email, :password, :password_confirmation, :name,

      attr_accessor :password
      before_save :encrypt_password
      before_save { |user| user.email = email.downcase }
      before_save { |user| user.name = name.downcase }
      before_create { generate_token(:auth_token) }
      before_create { generate_token(:email_token) }

      VALID_PASSWORD_REGEX = /^(?=.*[a-zA-Z])(?=.*[0-9]).{6,}$/
      validates_confirmation_of :password
      validates :password, :on => :create, presence: true, format: { with: VALID_PASSWORD_REGEX }
      validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }
      validates :name, presence: true, format: { with: VALID_NAME_REGEX }, uniqueness: { case_sensitive: false }, length:  { minimum: 4 }

所以我尝试删除:on => :create,但是当我登录时,我收到一条错误,说密码无效,即使它是。所以它不允许@user.save!

用户控制器

  def update
    if @user.update_attributes(params[:user])
      redirect_to @user
    else
      render "edit"
    end
  end

3 个答案:

答案 0 :(得分:2)

尝试这样的事情:

validates :password, :presence => {:on => :create}, :confirmation => true, format: { with: VALID_PASSWORD_REGEX }

我认为你编写它的方式只会在创建时执行整个操作并完全排除更新

答案 1 :(得分:1)

尝试使用::on => [:create, :update]。但这意味着在用户保存的任何时候,您都需要输入密码并进行确认,因为它存储为加密,因此可能无法在用户实例中调用。 (否则不安全。)

答案 2 :(得分:1)

假设加密的密码属性名为encrypted_password

仅在我们需要密码设置时验证。

validates :password, format: { with: VALID_PASSWORD_REGEX }, if: :password_required?

def password_required?
  encrypted_password.blank? || !password.blank?
end