我有一个带有reset_token方法的成员模型(该方法为用户分配一个新令牌,以便向他们发送电子邮件以重置他们的密码)。但是update_attribute从不在数据库中保存任何内容。我有:new_password_token分配给attr_accessible和attr_accessor。日志获取盐和令牌,但它总是返回nil
def self.reset_token(email)
member = find_by_email(email)
if member
#Reset token, and then send email
salt = BCrypt::Engine.generate_salt
logger.error "Salt is #{salt}"
token = BCrypt::Engine.hash_secret(email, salt)
logger.error "token is #{token}"
if member.update_attribute(:new_password_token, token)
member
end
end
nil
end
被调用的控制器方法:
def reset_password
@member = Member.reset_token(params[:email])
if @member
redirect_to(root_url, :notice => "Please check your email for instructions")
else
redirect_to(root_url, :notice => "Sorry we have no record of your account")
end
end
尝试从模型中删除attr_accessor。Attr_accessor正在为new_password_token创建读取器和写入器方法。writer方法相当于:
def new_password_token=(new_password_token)
@new_password_token = new_password_token
end
所以当你update_attribute
时,它只是在你的对象上设置一个实例变量,并绕过数据库。