Posted at

Rails チュートリアル メモ 第8章

More than 1 year has passed since last update.


メモ


  • 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 検索が走るのが嫌なら、取得結果をインスタンス変数に格納するとよい



  • 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 にする必要がある