エンジニア志望のブログ

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
コンソールで確認する演習やブラウザで確認する演習は手間がかかるので、、

ぼっち演算子の名前が面白くてすこし調べてみたところ&.が一人でしゃがんでるように見えるからだとか、、
確かに見えなくもないですね笑

折り返し地点にきました!
引き続き頑張ります!!