kouの技術的メモ

学習した内容の定着やアウトプット用に開設しました

Railsチュートリアル8章   基本的なログイン機構

セッション、クッキー周りはnode.jsで触り程度に学習済みですが、復習も兼ねて記録します。

セッションの説明

httpにはリクエスト、レスポンスの一対のやり取りで全て終わり、次回以降に情報を保持する仕組みがありません。(ステートレス・プロトコル)

そこでログイン情報を保持するためにセッションという仕組みを使います。
クライアント側(ブラウザ)と、サーバサイドに情報を保持させ、間に入るhttpは通信だけしていれば良いという感じです。
具体的にはRailsにおいてはcookiesというシステムを使います。 cookiesとは、ユーザーのブラウザに保存される小さなテキストデータです。

7,8章ではsessionメソッドを使い、9章ではcookiesメソッドを使って実装します。

8.1.3 ユーザーの検索と認証

復習

has_secure_passwordが提供するauthenticateメソッド
引数に渡された文字列 (パスワード) をハッシュ化した値と、データベース内にあるpassword_digestカラムの値を比較する
8.1.4 フラッシュメッセージを表示する

ログイン失敗のフラッシュを使うためにflash[:danger]を使いたいが、renderを使う場合、一つ先のリクエスト先まで(例えばHome画面のリンクをクリックした場合も)フラッシュメッセージが残ってしまう。 今のページのみフラッシュを表示させるために、flash.now[:denger]を使う。

○ flash.now[:danger] ='メッセージ'
現在のリクエストでのみ有効なメッセージを設定する。
現在のリクエストが終了した時点で、自動的にメッセージは削除される。
renderで表示する画面にメッセージを表示したい場合に用いる。

X flash[:danger] ='メッセージ'
次のリクエストまで有効なメッセージを設定する。
次のリクエストが終了した時点で、自動的にメッセージは削除される。
redirect_toした先の画面でメッセージを表示したい場合に用いる。
renderを使用しているにもかかわらず、flash[:danger]を使用してしまうと、
1つ先の画面にも同じメッセージが表示されてしまう。
8.2.2 現在のユーザー

現在ログイン中のユーザーをcurrent_userとししたいのですが、current_userはページ読み込みのたびに何度も使われる可能性があるので、
そのたびにデータベースから読み込みをしてしまうと、読み込みが遅くなってしまう。
よって、一回読込したら使い回せるように、@current_userのインスタンス変数に代入して使い回せるようにします。 さらに以下の式で代入することにより、データベースへの称号も必要最小限にします。

@current_user ||= User.find_by(id: session[:user_id])

この||=オアイコールは短絡評価といい、以下の式と等価となります
@current_user = @current_user || User.find_by(id: session[:user_id])
||は左から順に敷きを評価するので、@current_userに値があれば、@current_userの値をそのまま使い、
@curret_userに値がなければUser.find_by(id: session[:user_id])代入する
8.2.4 レイアウトの変更をテストする

ログイン・ログアウトでヘッダーのリンク表示を変えたので、動作するのかテストする必要があります。 ただ、今回の注意点はログイン、ログアウトをテスト時に使う必要があることです。 fixtureファイル(test/fixtures/users.yml)にユーザーのテスト時のログインに必要な情報を作成しておきます。

michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>

User.digest('password')は、パスワードをテスト用の簡易的な暗号化をするメソッド(計算コストを下げる為)で、
ユーザーモデルでUser.digestメソッドを作り、それをERb呼び出している。fixureはERbが使えます。
上記のfixureではテスト時にわかりやすいようにパスワードはpasswordとしています。


テストコードで実際にfixtureデータを使うときは
user = users(:michael)
のような書き方となります。
8.2.5 ユーザー登録時にログイン

演習にて豆知識

Cloud9の一括コメントアウト 方法

工夫

章を重ねるごとにだんだん複雑度が増してきたのと、日数が経つと過去に書いたソースコードの意味するところを忘れている所がで始めているので、
今回からソースコードにコメント機能を使って、その行のコードが何をしているかを直接書いて行くことにしました。 このやり方は私に合っているようで、コードに対するより深い理解と、記憶の定着を実感できた。

8章のまとめ
  • sessionメソッドを使うと状態を保持したままページを移動できる。sessionメソッドはsession[:user_id] = user.idのように使う。
  • sessionメソッドを使うと、ユーザーIDなどをブラウザに一時的に保存できる
  • ログインフォームでは、ユーザーがログインするための新しいセッションが作成できる。また、sessionについての(ログインについての)専用コントローラを作成し、RESTfulなAPIを使う。
  • flash.nowメソッドを使うと、描画済みのページにもフラッシュメッセージを表示でき、また表示はリダイレクトしなくてもそのページだけとなる。
  • ログインの状態に応じて、ページ内で表示するリンクを切り替えることができる