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

回答編集履歴

4

不要なコードも含めて回答を見直し修正しました。

2020/02/18 05:59

投稿

rhiroe
rhiroe

スコア2352

answer CHANGED
@@ -9,17 +9,17 @@
9
9
  ```diff
10
10
  def login
11
11
  - @user = User.find_by(email: params[:email])
12
- + @user = User.find_or_initialize_by(email: params[:email])
12
+ + @user = User.find_or_initialize_by(email: user_params[:email])
13
13
 
14
14
  - if @user && @user.authenticate(params[:password])
15
- + if @user.persisted? && @user.authenticate(params[:password])
15
+ + if @user.persisted? && @user.authenticate(user_params[:password])
16
16
  session[:user_id] = @user.id
17
17
  flash[:notice] = "ログイン成功"
18
18
  redirect_to("/posts/index")
19
19
  else
20
- @error_message = "メールアドレスかパスワードが違います"
20
+ - @error_message = "メールアドレスかパスワードが違います"
21
- @email = params[:email]
21
+ - @email = params[:email]
22
- @password = params[:password]
22
+ - @password = params[:password]
23
23
  render("users/login_form")
24
24
  end
25
25
  end
@@ -27,5 +27,5 @@
27
27
  `form_for`にモデルのインスタンスを渡しただけの場合、そのインスタンス情報が新規で作られたものであれば`create`に、DBから取り出したものであれば`edit`に向けて送信されます。
28
28
  今回はそのどちらでもない`login`に送信したいわけですので`:url`を明示的に指定しましょう。
29
29
  ```erb
30
- <%= form_for @user, url: users_login_path do |f| %>
30
+ <%= form_for @user, url: login_path do |f| %>
31
31
  ```

3

修正

2020/02/18 05:59

投稿

rhiroe
rhiroe

スコア2352

answer CHANGED
@@ -11,7 +11,8 @@
11
11
  - @user = User.find_by(email: params[:email])
12
12
  + @user = User.find_or_initialize_by(email: params[:email])
13
13
 
14
- if @user && @user.authenticate(params[:password])
14
+ - if @user && @user.authenticate(params[:password])
15
+ + if @user.persisted? && @user.authenticate(params[:password])
15
16
  session[:user_id] = @user.id
16
17
  flash[:notice] = "ログイン成功"
17
18
  redirect_to("/posts/index")

2

修正

2020/02/18 04:13

投稿

rhiroe
rhiroe

スコア2352

answer CHANGED
@@ -1,9 +1,11 @@
1
1
  他の回答者さんもおっしゃっていますが、`find_by`だと`nil`を返す可能性があるので、必ず`User`インスタンスを返すようにしましょう。
2
+
2
3
  ```diff
3
4
  def login_form
4
5
  + @user = User.new
5
6
  end
6
7
  ```
8
+
7
9
  ```diff
8
10
  def login
9
11
  - @user = User.find_by(email: params[:email])

1

追記

2020/02/18 04:08

投稿

rhiroe
rhiroe

スコア2352

answer CHANGED
@@ -1,5 +1,10 @@
1
1
  他の回答者さんもおっしゃっていますが、`find_by`だと`nil`を返す可能性があるので、必ず`User`インスタンスを返すようにしましょう。
2
2
  ```diff
3
+ def login_form
4
+ + @user = User.new
5
+ end
6
+ ```
7
+ ```diff
3
8
  def login
4
9
  - @user = User.find_by(email: params[:email])
5
10
  + @user = User.find_or_initialize_by(email: params[:email])