railsチュートリアル第八章 フラッシュメッセージを表示させる

###フラッシュメッセージを表示させる

####ログイン失敗時の処理を扱う
app/controllers/sessions_controller.rb

```rb
class SessionsController < ApplicationController

  def new
  end
  
  def create
    user = User.find_by(email: params[:session][:email].downcase)
    # 送信されたメアドを使ってデータベースから取り出す。
    #emailを小文字にする
    if user && user.authenticate(params[:session][:password])
    # user  取得したユーザーが有効かどうか？
    # その後にデータベース上にパスワードがあるか？
      # ユーザーログイン後にユーザー情報のページにリダイレクトする
    else
      flash[:danger] = 'Invalid email/password combination' # 本当は正しくない
      # エラーメッセージを作成する
        render 'new'
        # newアクションのビューを表示
    end
  end

  def destroy
  # ユーザー削除
  end
end
```

###フラッシュのテスト
統合テストを作成

```rb
ubuntu:~/environment/sample_app (basic-login) $ rails generate integration_test users_login
Running via Spring preloader in process 12316
      invoke  test_unit
      create    test/integration/users_login_test.rb
```

####フラッシュメッセージの残留をキャッチするテスト
test/integration/users_login_test.rb

```rb
require 'test_helper'

class UsersLoginTest < ActionDispatch::IntegrationTest
  test "login with invalid information" do
    get login_path
    assert_template 'sessions/new'
    post login_path, params: { session: { email: "", password: "" } }
    assert_template 'sessions/new'
    assert_not flash.empty?
    get root_path
    assert flash.empty?
  end
end
```
テストをする

```
rails test test/integration/users_login_test.rb
```
失敗

```
ubuntu:~/environment/sample_app (basic-login) $ rails test test/integration/users_login_test.rb
Running via Spring preloader in process 12488
Started with run options --seed 15

 FAIL["test_login_with_invalid_information", #<Minitest::Reporters::Suite:0x000055b9dcd39cf8 @name="UsersLoginTest">, 1.5503717980000147]
 test_login_with_invalid_information#UsersLoginTest (1.55s)
        Expected false to be truthy.
        test/integration/users_login_test.rb:11:in `block in <class:UsersLoginTest>'

  1/1: [================================] 100% Time: 00:00:01, Time: 00:00:01

Finished in 1.55460s
1 tests, 4 assertions, 1 failures, 0 errors, 0 skips
```
####ログイン失敗時の正しい処理 リクエスト後メッセージ消滅
app/controllers/sessions_controller.rb

```rb
class SessionsController < ApplicationController

  def new
  end
  
  def create
    user = User.find_by(email: params[:session][:email].downcase)
    # 送信されたメアドを使ってデータベースから取り出す。
    #emailを小文字にする
    if user && user.authenticate(params[:session][:password])
    # user  取得したユーザーが有効かどうか？
    # その後にデータベース上にパスワードがあるか？
      # ユーザーログイン後にユーザー情報のページにリダイレクトする
    else
      flash.now[:danger] = 'Invalid email/password combination'
      # flash.nowでリクエストが発生後メッセージを消滅する
      # エラーメッセージを作成する
        render 'new'
        # newアクションのビューを表示
    end
  end

  def destroy
  # ユーザー削除
  end
end
```
テスト

```
ubuntu:~/environment/sample_app (basic-login) $ rails test test/integration/users_login_test.rb
Running via Spring preloader in process 12888
Started with run options --seed 42102

  1/1: [================================] 100% Time: 00:00:01, Time: 00:00:01

Finished in 1.54269s
1 tests, 4 assertions, 0 failures, 0 errors, 0 skips
ubuntu:~/environment/sample_app (basic-login) $ rails tRunning via Spring preloader in process 12899
Started with run options --seed 57135

  23/23: [==============================] 100% Time: 00:00:01, Time: 00:00:01

Finished in 1.43981s
23 tests, 48 assertions, 0 failures, 0 errors, 0 skips
```
###演習
1.
8.1.4の処理の流れが正しく動いているかどうか、ブラウザで確認してみてください。特に、flashがうまく機能しているかどうか、フラッシュメッセージの表示後に違うページに移動することを忘れないでください。
確認。