Rails 3 update_attribute未触发

时间:2011-07-09 21:50:01

标签: ruby-on-rails ruby-on-rails-3 activerecord update-attribute

我有一个带有reset_token方法的成员模型(它为用户分配一个新令牌,以便向他们发送电子邮件以重置他们的密码)。但update_attribute从不保存数据库中的任何内容。我有:new_password_token分配给attr_accessible和attr_accessor。日志获取salt和token但它总是返回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

1 个答案:

答案 0 :(得分:2)

尝试从模型中删除attr_accessor。 attr_accessor正在为new_password_token创建reader和writer方法。 writer方法相当于:

def new_password_token=(new_password_token)
  @new_password_token = new_password_token
end

所以当你update_attribute时,它只是在你的对象上设置一个实例变量并完全绕过数据库。