1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

####ログイン失敗時の処理を扱う
app/controllers/sessions_controller.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

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

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

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

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がうまく機能しているかどうか、フラッシュメッセージの表示後に違うページに移動することを忘れないでください。
確認。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?