attr_accessor и проверка пароля при обновлении

I есть этот код в моей пользовательской модели:

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

  before_save :encrypt_password

  validates :email, :presence => true,
                    :uniqueness => { :case_sensitive => false },
                    :format => { :with => /\A[^@]+@[^@]+\z/ },
                    :length => 7..128
  validates :password, :presence => true,
                       :confirmation => true,
                       :length => 6..128

  private
    def encrypt_password
      return unless password
      self.encrypted_password = BCrypt::Password.create(password)
    end
end

Теперь в моем контроллере, когда я обновляю некоторые пользовательские поля с помощью

@user.update_attributes(params[:user])

, поле пароля всегда проверяется, даже если оно не установлено в хэше params. Я полагал, что это происходит из-за attr_accesor: password, который всегда устанавливает пароль = "" для update_attributes.

Теперь я могу просто пропустить проверку пароля, если это пустая строка:

validates :password, :presence => true,
                     :confirmation => true,
                     :length => 6..128,
                     :if => "password.present?"

Но это не работает, потому что позволяет пользователю установить пустой пароль.

Использование update_attribute в поле, которое я хотел бы изменить, не является решением, потому что мне нужна проверка этого атрибута. Если я передам точный параметр с помощью

@user.update_attributes(params[:user][:fieldname])

, это не решит проблему, потому что он также запускает проверку пароля.

Есть ли способ запретить attr_accesor: password всегда устанавливать пароль = "" при обновлении?

5
задан mjaros 17 November 2011 в 16:10
поделиться