У меня есть этот код в моей модели пользователя:
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: пароля, который всегда устанавливает пароль = "" в update_attributes.
Теперь я могу просто пропустить проверку пароля, если это пустая строка:
validates :password, :presence => true,
:confirmation => true,
:length => 6..128,
:if => "password.present?"
Но это не работает, потому что позволяет пользователю установить пустой пароль.
Использование update_attribute в поле, которое я хотел бы изменить, не является решением, поскольку мне требуется проверка этого атрибута.
Если я передам точный параметр с
@user.update_attributes(params[:user][:fieldname])
это не решает проблему, поскольку также запускает проверку пароля.
Есть ли способ предотвратить attr_accesor: пароль всегда устанавливает пароль = "" при обновлении?