teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

rememberメソッド の変更を追記

2020/12/19 09:51

投稿

outmysd
outmysd

スコア3

answer CHANGED
@@ -48,4 +48,57 @@
48
48
  assert !is_logged_in?
49
49
  end
50
50
  end
51
+ ```
52
+
53
+ ※追記 再びエラーが出たので、app/models/user.rbのrememberメソッドを書き換えてgreenにしました。
54
+ ```
55
+ class User < ApplicationRecord
56
+ attr_accessor :remember_token
57
+ before_save { self.email = email.downcase }
58
+ validates :name, presence: true, length: { maximum: 50 }
59
+ VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i
60
+ validates :email, presence: true, length: { maximum: 255 },
61
+ format: { with: VALID_EMAIL_REGEX },
62
+ uniqueness: true
63
+ has_secure_password
64
+ validates :password, presence: true, length: { minimum: 6 }
65
+
66
+ # 渡された文字列のハッシュ値を返す
67
+ def User.digest(string)
68
+ cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
69
+ BCrypt::Engine.cost
70
+ BCrypt::Password.create(string, cost: cost)
71
+ end
72
+
73
+ # ランダムなトークンを返す
74
+ def User.new_token
75
+ SecureRandom.urlsafe_base64
76
+ end
77
+
78
+ # 永続セッションのためにユーザーをデータベースに記憶する
79
+ def remember
80
+ self.remember_token = User.new_token
81
+ update_attribute(:remember_digest, User.digest(:remember_token))
82
+ end
83
+
84
+ # 渡されたトークンがダイジェストと一致したらtrueを返す
85
+ def authenticated?(remember_token)
86
+ return false if remember_digest.nil?
87
+ BCrypt::Password.new(remember_digest).is_password?(remember_token)
88
+ end
89
+
90
+ # ユーザーのログイン情報を破棄する
91
+ def forget
92
+ update_attribute(:remember_digest, nil)
93
+ end
94
+ end
95
+ ```
96
+
97
+ 下記にあるコードが以前のrememberメソッドです
98
+ remember_tokenをシンボルにし忘れていました。
99
+ ```
100
+ def remember
101
+ self.remember_token = User.new_token
102
+ update_attribute(:remember_digest, User.digest(remember_token))
103
+ end
51
104
  ```