0

reset_tokenメソッド(パスワードをリセットするための電子メールを送信するためにユーザーに新しいトークンを割り当てる)を使用したメンバーモデルがあります。ただし、update_attributeはデータベースに何も保存しません。attr_accessibleとattr_accessorに:new_password_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
4

1 に答える 1

2

モデルからattr_accessorを削除してみてください。attr_accessorは、new_password_tokenのリーダーメソッドとライターメソッドを作成しています。writerメソッドは次と同等です。

def new_password_token=(new_password_token)
  @new_password_token = new_password_token
end

したがってupdate_attribute、オブジェクトにインスタンス変数を設定し、データベースを完全にバイパスしている場合です。

于 2011-07-10T00:05:27.573 に答える