我有一个应用程序,其中包含用于创建帐户的验证密码。但是,当用户更新其密码时,它会忽略所有验证。
用户控制器
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
答案 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