第?部 アプリケーションを構築する
第11章 タスクF:ユーザ管理
サンプルアプリの構築も大詰めです。
この章ではユーザー管理機能を追加します。
ユーザ認証やアクセス制限なんかを実装します。
この章のトピックはこんなところです。
- リクエストがGETかPOSTか区別する
- ActiveRecordのコールバックフック
- すべてのコントローラーから呼び出せるメソッドをapplication.rbに
- アクションメソッドのフィルタ
- アプリのドキュメント作成
ま・ず・は、ユーザ管理するためにユーザテーブルを作ります。
で、ユーザー追加画面を表示するアクションメソッドをコントローラに書くわけですが、
ユーザー登録画面は例のモデルを使ったヘルパーメソッドでインプットフィールドを作成します。
というわけで、ユーザー追加画面を表示するアクションメソッドでユーザのモデルをインスタンス化する必要があります。
また、画面を表示するアクションメソッドに
・画面を表示する
・ユーザーを登録する
という2つの機能を持たせます。
リクエストがGETかPOSTか判別する
画面を表示するときはGETリクエストが飛んできて、ユーザーを登録するときはPOSTメソッドが飛んでくる、という前提です。
で、このアクションメソッドはこうなります。
def add_user if request.get? @user = User.new else @user = User.new(params[:user]) if @user.save redirect_to_index("user #{@user.name} is created") end end end
request.get?メソッドは、リクエストがGETの場合にtrueになります。
GETリクエストのときはユーザーモデルをnewします。
POSTリクエストのときはフォームからのデータでユーザーを登録します。
平文を登録直前にハッシュ化する
で、ユーザーを登録するときに1つ課題が。
ユーザーのパスワードはハッシュに掛けた値をテーブルに格納します。
POSTリクエストで受け取ったパスワードは平文なので、ハッシュ化する必要があります。
ここでは、ActiveRecordのフック機能を利用して、レコードを作成するときにbefore_create()というフックメソッドを呼び出し、このメソッドでハッシュ化します。
def before_create self.hashed_password = User.hash_password(self.password) end def after_create @password = nil end private def self.hash_password(password) Digest::SHA1.hexdigest(password) end
レコードを作成するとき(モデルインスタンスのsaveメソッドを呼び出したとき)にbefore_createメソッドがフックされて、パスワードをハッシュ化します。
ユーザーオブジェクトはセッションデータに格納されるため、(セッションデータを見てパスワードを知られないように)レコード作成後には平文のパスワードはクリアしておきます。
アクセス制限
で、次にアクセス制限をつくります。
ここではアクセス制限するために、アクションメソッドのフィルタ機能を使います。
セッションにユーザーIDがない(ログインしてない)場合はログイン画面をリダイレクトする認証用のアクションメソッドを作成します。
他のアクションメソッドを呼び出すときはbeforeフィルタを使って、呼び出す前に認証用アクションメソッドを呼び出すようにします。
beforeフィルタを使うためにはコントローラーにこんな風に書きます。
class AdminController < ApplicationController before_filter :authorize
authrizeメソッドが認証用アクションメソッドです。
このような共通アクションメソッドはapp/controllers/application.rbに書いておくとすべてのコントローラーで使うことができます。
アプリのドキュメントを作る
アプリのディレクトリで
%rake appdoc
と打つと、HTMLのアプリドキュメントが生成されます。
次の章ではRailsのテストについて述べてます。
正直、テストっつうと腰が引いてしまうのですが、がんばっていきまっしょい。
RailsによるアジャイルWebアプリケーション開発 | |
前田 修吾 オーム社 2006-02-25 売り上げランキング : Amazonで詳しく見る by G-Tools |