質問編集履歴

2

「試したこと」の追加

2020/05/06 01:47

投稿

jasonwick
jasonwick

スコア12

test CHANGED
File without changes
test CHANGED
@@ -167,3 +167,185 @@
167
167
 
168
168
 
169
169
  ```
170
+
171
+ ### 追記2
172
+
173
+ ログにあったpassword_resets_controller.rbの13行目にあたる @user.send_password_reset_email
174
+
175
+ のsend_password_reset_emailメソッドに問題があるのでは?と考え、それを定義しているapp/models/user.rbのファイル(下記コード)を確認しましたが特に問題は見当たりませんでした。
176
+
177
+
178
+
179
+ ```ここに言語を入力
180
+
181
+ class User < ApplicationRecord
182
+
183
+ attr_accessor :remember_token, :activation_token, :reset_token
184
+
185
+ before_save :downcase_email
186
+
187
+ before_create :create_activation_digest
188
+
189
+ validates :name, presence: true, length: { maximum: 50 }
190
+
191
+ VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(.[a-z\d\-]+)*.[a-z]+\z/i
192
+
193
+ validates :email, presence: true, length: { maximum: 255 },
194
+
195
+ format: { with: VALID_EMAIL_REGEX },
196
+
197
+ uniqueness: { case_sensitive: false }
198
+
199
+ has_secure_password
200
+
201
+ validates :password, presence: true, length: { minimum: 6 }, allow_nil: true
202
+
203
+ # 渡された文字列のハッシュ値を返す
204
+
205
+ def User.digest(string)
206
+
207
+ cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
208
+
209
+ BCrypt::Engine.cost
210
+
211
+ BCrypt::Password.create(string, cost: cost)
212
+
213
+ end
214
+
215
+
216
+
217
+ # ランダムなトークンを返す
218
+
219
+ def User.new_token
220
+
221
+ SecureRandom.urlsafe_base64
222
+
223
+ end
224
+
225
+
226
+
227
+ # 永続セッションのためにユーザーをデータベースに記憶する
228
+
229
+ def remember
230
+
231
+ self.remember_token = User.new_token
232
+
233
+ update_attribute(:remember_digest, User.digest(remember_token))
234
+
235
+ end
236
+
237
+
238
+
239
+ # トークンがダイジェストと一致したらtrueを返す
240
+
241
+ def authenticated?(attribute, token)
242
+
243
+ digest = send("#{attribute}_digest")
244
+
245
+ return false if digest.nil?
246
+
247
+ BCrypt::Password.new(digest).is_password?(token)
248
+
249
+ end
250
+
251
+
252
+
253
+ # ユーザーのログイン情報を破棄する
254
+
255
+ def forget
256
+
257
+ update_attribute(:remember_digest, nil)
258
+
259
+ end
260
+
261
+
262
+
263
+ # アカウントを有効にする
264
+
265
+ def activate
266
+
267
+ update_attribute(:activated, true)
268
+
269
+ update_attribute(:activated_at, Time.zone.now)
270
+
271
+ end
272
+
273
+
274
+
275
+ # 有効化用のメールを送信する
276
+
277
+ def send_activation_email
278
+
279
+ UserMailer.account_activation(self).deliver_now
280
+
281
+ end
282
+
283
+
284
+
285
+ # パスワード再設定の属性を設定する
286
+
287
+ def create_reset_digest
288
+
289
+ self.reset_token = User.new_token
290
+
291
+ update_attribute(:reset_digest, User.digest(reset_token))
292
+
293
+ update_attribute(:reset_sent_at, Time.zone.now)
294
+
295
+ end
296
+
297
+
298
+
299
+ # パスワード再設定のメールを送信する
300
+
301
+ def send_password_reset_email
302
+
303
+ UserMailer.password_reset(self).deliver_now
304
+
305
+ end
306
+
307
+
308
+
309
+ # パスワード再設定の期限が切れている場合はtrueを返す
310
+
311
+ def password_reset_expired?
312
+
313
+ reset_sent_at < 2.hours.ago
314
+
315
+ end
316
+
317
+
318
+
319
+ private
320
+
321
+
322
+
323
+ # メールアドレスをすべて小文字にする
324
+
325
+ def downcase_email
326
+
327
+ self.email = email.downcase
328
+
329
+ end
330
+
331
+
332
+
333
+ # 有効化トークンとダイジェストを作成および代入する
334
+
335
+ def create_activation_digest
336
+
337
+ self.activation_token = User.new_token
338
+
339
+ self.activation_digest = User.digest(activation_token)
340
+
341
+ end
342
+
343
+
344
+
345
+ end
346
+
347
+
348
+
349
+
350
+
351
+ ```

1

app/controllers/password_resets_controller.rb の追記

2020/05/06 01:47

投稿

jasonwick
jasonwick

スコア12

test CHANGED
File without changes
test CHANGED
@@ -21,3 +21,149 @@
21
21
  しかし、勉強不足がゆえにこれ以上先、何をすればよいのか分からず立ち往生しております。
22
22
 
23
23
  原因や解決策をご教示頂ければ幸いです。
24
+
25
+
26
+
27
+ ### 追記
28
+
29
+
30
+
31
+ app/controllers/password_resets_controller.rb
32
+
33
+
34
+
35
+ ```ここに言語を入力
36
+
37
+ class PasswordResetsController < ApplicationController
38
+
39
+ before_action :get_user, only: [:edit, :update]
40
+
41
+ before_action :valid_user, only: [:edit, :update]
42
+
43
+ before_action :check_expiration, only: [:edit, :update] # (1) への対応
44
+
45
+
46
+
47
+ def new
48
+
49
+ end
50
+
51
+
52
+
53
+ def create
54
+
55
+ @user = User.find_by(email: params[:password_reset][:email].downcase)
56
+
57
+ if @user
58
+
59
+ @user.create_reset_digest
60
+
61
+ @user.send_password_reset_email
62
+
63
+ flash[:info] = "Email sent with password reset instructions"
64
+
65
+ redirect_to root_url
66
+
67
+ else
68
+
69
+ flash.now[:danger] = "Email address not found"
70
+
71
+ render 'new'
72
+
73
+ end
74
+
75
+ end
76
+
77
+
78
+
79
+ def edit
80
+
81
+ end
82
+
83
+
84
+
85
+ def update
86
+
87
+ if params[:user][:password].empty? # (3) への対応
88
+
89
+ @user.errors.add(:password, :blank)
90
+
91
+ render 'edit'
92
+
93
+ elsif @user.update_attributes(user_params) # (4) への対応
94
+
95
+ log_in @user
96
+
97
+ flash[:success] = "Password has been reset."
98
+
99
+ redirect_to @user
100
+
101
+ else
102
+
103
+ render 'edit' # (2) への対応
104
+
105
+ end
106
+
107
+ end
108
+
109
+
110
+
111
+ private
112
+
113
+
114
+
115
+ def user_params
116
+
117
+ params.require(:user).permit(:password, :password_confirmation)
118
+
119
+ end
120
+
121
+
122
+
123
+ # beforeフィルタ
124
+
125
+
126
+
127
+ def get_user
128
+
129
+ @user = User.find_by(email: params[:email])
130
+
131
+ end
132
+
133
+
134
+
135
+ # 正しいユーザーかどうか確認する
136
+
137
+ def valid_user
138
+
139
+ unless (@user && @user.activated? &&
140
+
141
+ @user.authenticated?(:reset, params[:id]))
142
+
143
+ redirect_to root_url
144
+
145
+ end
146
+
147
+ end
148
+
149
+
150
+
151
+ # トークンが期限切れかどうか確認する
152
+
153
+ def check_expiration
154
+
155
+ if @user.password_reset_expired?
156
+
157
+ flash[:danger] = "Password reset has expired."
158
+
159
+ redirect_to new_password_reset_url
160
+
161
+ end
162
+
163
+ end
164
+
165
+ end
166
+
167
+
168
+
169
+ ```