Railsチュートリアル第8章
はじめに
Ruby on Railsチュートリアル(第6版)のメモ、演習の解答例を記述した記事です。
解答は個人のものなので、誤りがあればご指摘ください。
開発環境 Ruby: 2.7.2 , Rails: 6.1.4
メモ
認証システム
ログイン済みのユーザーがブラウザを閉じたらログイン状態を破棄する仕組みのこと
認可モデル
ユーザーがログインしているかどうかで使える機能やアクセスできるページを制御すること
セッション
ユーザの状態を保持するためのもの。
Railsでセッションを実装する最も一般的な方法はcookiesを使う方法。
cookiesはブラウザに保存されるテキストデータ。
cookiesに状態を保存する方法は二種類
・sessionメソッド:ブラウザを閉じると自動的にセッションの有効期限が切れる。
・cookiesメソッド:ユーザーがログアウトなどをして意図的にセッションを削除しないとブラウザを閉じてもセッションは長期的にブラウザに保たれる。
sessionメソッドの場合cookiesを盗み出されても盗まれたcookiesでログインされることはない。
Railsのメソッドであるsessionメソッドを利用してユーザの状態を保存する。
session[:user_id] = user.id
セッションを使う際は、Railsの全コントローラの親であるApplicationControllerにセッション用のヘルパーモジュールを読み込ませる必要がある。
class ApplicationController < ActionController::Base include SessionsHelper end
セッションの削除
session.delete(:user_id)
fixture
テスト時にログインできるかどうか検証するためにあらかじめデータを設定しておく必要がある。
このようなテスト用のデータをfixtureで作成できる。
ぼっち演算子
if user && user.authenticate(params[:session][:password])
が次のように書ける
if user&.authenticate(params[:session][:password])
演習
8.2.4
演習1
リスト 8.15の8行目にあるif userから下をすべてコメントアウトすると、ユーザー名とパスワードを入力して認証しなくてもテストが通ってしまうことを確認しましょう(リスト 8.26)。通ってしまう理由は、リスト 8.9では「メールアドレスは正しいがパスワードが誤っている」ケースをテストしていないからです。このテストがないのは重大な手抜かりですので、テストスイートで正しいメールアドレスをUsersのログインテストに追加して、この手抜かりを修正してください(リスト 8.27)。テストが red (失敗)することを確認し、それから先ほどの8行目以降のコメントアウトを元に戻すと green (パス)することを確認してください。
test "login with valid email/invalid password" do get login_path assert_template 'sessions/new' post login_path, params: { session: { email: @user.email, password: "invalid"}} assert_template 'sessions/new' assert flash.any? get root_path assert flash.empty? end
if user から下をコメントアウトしてテスト(RED)
yuy@yu sample_app % rails test Running via Spring preloader in process 53231 Started with run options --seed 3080 FAIL["test_login_with_valid_email/invalid_password", #<Minitest::Reporters::Suite:0x0000000136ce2b38 @name="UsersLoginTest">, 0.40365799999563023] test_login_with_valid_email/invalid_password#UsersLoginTest (0.40s) expecting <"sessions/new"> but rendering with <[]> test/integration/users_login_test.rb:35:in `block in <class:UsersLoginTest>' 24/24: [=============================] 100% Time: 00:00:00, Time: 00:00:00 Finished in 0.63630s 24 tests, 62 assertions, 1 failures, 0 errors, 0 skips
コメントアウトを消してテスト(GREEN)
Running via Spring preloader in process 53284 Started with run options --seed 17884 24/24: [=============================] 100% Time: 00:00:00, Time: 00:00:00 Finished in 0.72054s 24 tests, 64 assertions, 0 failures, 0 errors, 0 skips
おわりに
演習の解答を書くと言っておいて全然記述しいてなくてすみませんm(__)m
コンソールで確認する演習やブラウザで確認する演習は手間がかかるので、、
ぼっち演算子の名前が面白くてすこし調べてみたところ&.が一人でしゃがんでるように見えるからだとか、、
確かに見えなくもないですね笑
折り返し地点にきました!
引き続き頑張ります!!