回答編集履歴

4

a

2019/12/31 00:04

投稿

KazuSaka
KazuSaka

スコア640

test CHANGED
@@ -64,9 +64,17 @@
64
64
 
65
65
  しかし、marokakさんが今回うまくいかなかったのは、nameやpasswordなど設定していないので、validationにひっかかって、DB保存に失敗していたと思います。
66
66
 
67
- find_or_create_by(name: "GuestUser", email: 'guest@example.com', password: SecureRandom.urlsafe_base64)
68
67
 
68
+
69
+ ```ruby
70
+
71
+ user = User.find_or_create_by(name: "GuestUser", email: 'guest@example.com', password: SecureRandom.urlsafe_base64)
72
+
73
+ ```
74
+
75
+
76
+
69
- のように、validationにひっかからないように、find_or_create_byに引数を渡せば、保存されるかと思います。ユーザーが既に存在すれば、ユーザーを返します。
77
+ のように、validationにひっかからないように、find_or_create_byにand条件で引数を渡せば、保存されるかと思います。ユーザーが既に存在すれば、ユーザーを返します。
70
78
 
71
79
 
72
80
 

3

2019/12/31 00:04

投稿

KazuSaka
KazuSaka

スコア640

test CHANGED
@@ -50,6 +50,24 @@
50
50
 
51
51
  ```
52
52
 
53
+ 以上
54
+
55
+
56
+
57
+ ###追記
58
+
59
+ 少し勘違いしていました。訂正させてください。
60
+
61
+
62
+
63
+ **find_or_create_byはDB保存までされます。**
64
+
65
+ しかし、marokakさんが今回うまくいかなかったのは、nameやpasswordなど設定していないので、validationにひっかかって、DB保存に失敗していたと思います。
66
+
67
+ find_or_create_by(name: "GuestUser", email: 'guest@example.com', password: SecureRandom.urlsafe_base64)
68
+
69
+ のように、validationにひっかからないように、find_or_create_byに引数を渡せば、保存されるかと思います。ユーザーが既に存在すれば、ユーザーを返します。
70
+
53
71
 
54
72
 
55
73
  以上

2

2019/12/31 00:01

投稿

KazuSaka
KazuSaka

スコア640

test CHANGED
@@ -1,6 +1,6 @@
1
1
  ###回答
2
2
 
3
- user = User.find_or_create_by(email: 'guest@example.com')
3
+ **user = User.find_or_create_by(email: 'guest@example.com')**
4
4
 
5
5
  上記のコードを実行すると、
6
6
 

1

2019/12/30 22:16

投稿

KazuSaka
KazuSaka

スコア640

test CHANGED
@@ -4,10 +4,52 @@
4
4
 
5
5
  上記のコードを実行すると、
6
6
 
7
- DBに存在すれば、そのユーザーを返す
7
+ emailがDBに存在すれば、そのユーザーを返す
8
8
 
9
- DBに存在しなければ、[id: nil, name: nil, email: 'guest@example.com',password: nil]が生成されるだけだと思います。ですので、user.idnil
9
+ emailがDBに存在しなければ、[id: nil, name: nil, email: 'guest@example.com',password: nil]が生成されるだけだと思います。userをDBに保存しないと、ID発行されません。
10
+
11
+ ですので、user.idはnilでsession[:user_id] = user.idを実行しても、ログイン状態にはなりません。
10
12
 
11
13
 
12
14
 
15
+ 新規ユーザーもログインさせたいなら、DBに保存して、user.idを発行後に
16
+
13
- 新規ユーザーもログインさせたいなら、DBに保存して、session[:user_id] = user.idを実行すればよいと思います。
17
+ session[:user_id] = user.idを実行すればよいと思います。
18
+
19
+
20
+
21
+ 以下、コード。
22
+
23
+ 新規ユーザーの場合はDBに保存の1文を追加しました。
24
+
25
+ ご確認ください。
26
+
27
+
28
+
29
+ ```ruby
30
+
31
+ (users_controller.rb)
32
+
33
+ def guest_login
34
+
35
+ user = User.find_or_create_by(email: 'guest@example.com')
36
+
37
+ user.name = "GuestUser"
38
+
39
+ user.password = SecureRandom.urlsafe_base64
40
+
41
+ user.save if !user.id #idがない場合、DBに保存してIDを生成
42
+
43
+ session[:user_id] = user.id
44
+
45
+ redirect_to("/posts/index")
46
+
47
+ flash[:notice] = "ゲストユーザーとしてログインしました"
48
+
49
+ end
50
+
51
+ ```
52
+
53
+
54
+
55
+ 以上