読者です 読者をやめる 読者になる 読者になる

Rails Tutorial 第3版 第8章

Ruby on Rails チュートリアル:実例を使って Rails を学ぼう の2周目です。
第8章 ログイン、ログアウト | Rails チュートリアル

第8章 ログイン、ログアウト

sessionを利用したログイン機能の実装。
cookieを利用した永続化。
そのあと、ユーザーが選択できるようにremember-me機能の実装、 となかなか盛りだくさんですが、内容はとても良いです。
(「8.4.1 記憶トークンと暗号化」の冒頭のセキュリティについて言及しているところも良い。)
一回実装してみて、もう一度整理しながら読み直すと良いです。

authenticateメソッド

has_secure_password が提供する authenticate メソッドで認証する。

digestメソッド

cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                              BCrypt::Engine.cost
BCrypt::Password.create(string, cost: cost)

ファイル単位でのtest実施

bundle exec rake test TEST=test/integration/users_login_test.rb

テスト名を指定してtest実施

bundle exec rake test TEST=test/integration/users_login_test.rb \
TESTOPTS="--name test_login_with_valid_information"

ヘルパーメソッドはテストから呼び出せない

ややこしいが、is_logged_in? メソッドを logged_in? とは別にtest_helper に実装する理由。 余談ですが、double bang は推奨しないようなんですね。(rubocopでも怒られますし)

def is_logged_in?
  ## !!session[:user_id]
  !session[:user_id].nil?
end

session

sessionメソッドで作成した一時cookiesは自動的に暗号化される
(ただし一時セッションのみ)

bcryptのハッシュは復号化できない

redirectのテスト

# リダイレク先が正しいかどうか
assert_redirected_to @user
# 実際にそのページに移動
follow_redirect!

assert_select count:

assert_select "a[href=?]", login_path, count: 0

cookies.signed

cookieの暗号化

sessionが使えるのはintegration testの場合のみ

test_helper で以下を実装。

# 統合テスト内ではtrueを返す
def integration_test?
  defined?(post_via_redirect)
end