メモ
- form_for はモデルがなくても使うことができる
form_for(:session, url: login_path)
- 所感: セッションを管理するモデルを作るような設計にはできないのだろうか
- 認証するときは、モデルのインスタンスから生えている
authenticate
メソッドが使える- モデルで
has_secure_password
すると生えるやつ(復習)
- モデルで
- render で flash を表示させると、メッセージが残ってしまう
- render は強制的な画面の描画であり、リクエストとは見なされないため?
-
flash.now
を使う
- 本来ヘルパーは(たぶん)view で使うものだが、
include
さえしてしまえばコントローラーでも使える
-
session
について- ハッシュ感覚で使える
- データは「セッション Cookie」に保存される(= ブラウザを閉じると消える)
- 自動的に暗号化される!
- なので、
session
には割と気軽にデータを入れちゃってよい -
cookies
は暗号化されないらしい- 今回みたいに DB 上のユーザー ID を
cookies
に入れてしまうと、簡単に他のユーザーに成りすますことができてしまう
- 今回みたいに DB 上のユーザー ID を
- なので、
- 都度 DB 検索が走るのが嫌なら、取得結果をインスタンス変数に格納するとよい
- fixture の yml では erb が使える
user = users(:michael)
上の users は
fixture
のファイル名 users.yml を表し、:michael
というシンボルはリスト 8.22 のユーザーを参照するためのキーを表します。
- assert_select でこういう書き方ができる
assert_select "a[href=?]", logout_path
- 前はこうやって書いたけど、お手本の方がきれいだ
assert_select "a[href=\"#{logout_path}\"]"
- さらに、ヒットしないことをテストするには
count
を使ってこのように書ける
assert_select "a[href=?]", login_path, count: 0
- これも前は
false
を渡して書いたけど、意味がよくわからないのでお手本の方が意図が伝わりやすい
assert_select "a[href=\"#{login_path}\"]", false
- session を消すときは
session.delete(:user_id)
-
is_logged_in
というメソッド名はいかがなものかと思い、test_logged_in
という名前にしたら、test_
から始まるメソッド名は minitest ではテストケースを意味してしまうので、テスト全体がバグって実行できなくなってしまった・・・。
- 前述の通り、毎回 DB を検索するのを嫌って、このサンプルアプリでは current_user をインスタンス変数に格納している。
- しかし、それをやったからには log_out メソッドで
@current_user
を忘れずに nil にする必要がある