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