空想犬猫記

※当日記では、犬も猫も空想も扱っておりません。(旧・エト記)

DHH 進捗 (4)

DHH 本の続き。今日は chapter 11。認証の仕組みを作る。だんだん,初歩的な説明は省かれるようになってきたが,今までしっかり読んできたおかげで,特に stack する場所は無い。ユーザが入力した plain text の password をハッシュ化してデータベースにしまう仕様にするのだが,ハッシュ化のタイミングとして,予め ActiveRecord に用意された callback である before_create() を使う。さらに,ハッシュ化して保存し,不要になった plain text を削除しておくために after_create() を使う。なるほどね。これからは,困った時には「おあつらえ向きのコールバックがあるはず」と疑ってかかることにしよう。
この章から,コマンドやソースコードの省略が多くなった気がする。そろそろ独り立ちせよってことだろうか。確かに,書いてある通りにばかりやってると,いつの間にか思考停止してしまうことがある。なのでこれは手抜きではなく,著者の好意だと思うことにする。

We also need a login view, login.rhtml. This is pretty much identical to the add_user view, so let's not clutter up the book by showing it here...

などと書いてあって,後ろの appendix にソースコードがついてるよ,と書いてある。この部分は DRY な感じじゃなかったのが,残念。まぁ,この辺は細かい所なのでよしとしよう。
authorization の仕組みで,また私は Rails マジックを見た。その名も filter 機能。

class AdminController < ApplicationController
  before_filter :authorize
  # ...
end

のように書いておくだけで,authorize メソッド(ログイン状態をチェックし,認証されなければログイン画面にリダイレクトする)を自動的に読んでくれるようにできる。アクティブなコールバックとでも言うべきものだろうか*1。で,全ての画面でこれをしちゃうと,ログイン画面にすらアクセスできなくなってしまうので,ログインが面だけこの処理を免除 exempt する。つまり LoginController の場合は

class LoginController < ApplicationController
  before_filter :authorize, :except => :login
  # ...
end

と,書く。
すごいぞDHHえもん!before_filter が登場した時に,「ピコピコピン──!」…と,ポッケから道具を出す音が聞こえたような気がした(我ながらおめでたい読者である)。で,だんだんソースコードの省略が板についてきたらしく,挙げ句の果てには

Adding a user list to the login controller is easy; in fact it's so easy we won't bother to show it here....

こんなことを言い出した。Appendix に載せてあるソースコードの説明が,少し書いてある程度。まあいいか。
そして最後に

  1. ログインしていないユーザが,アクセス制限のかかった領域にアクセス
  2. ログイン画面を表示
  3. 認証完了後,アクセスしようとしていたページにリダイレクト

する仕組みを,セッションクッキーを使って実現する方法も紹介されていた。
DHH

*1:それともこういう callback の定義の仕方は ruby では普通なんだろうか,いずれにせよ新鮮