ユーザ認証用のプラグインの導入とテーブルの生成

普通なら、ここでDBにテーブルを作ってしまうか、テーブル生成用のmigrationを書くのでしょうが、今回はユーザ認証のシステムを作る必要があるため、まずはプラグインを入れておきます。restful_authenticationというのがあるらしいのですが、今回Rails自体のバージョンが古いため、代わりに古い acts_as_authenticated を導入します。

プラグインの導入

といってもコマンドはまた一行だけ。

% script/plugin install acts_as_authenticated

すると、自動的に必要なものをダウンロードして vendor/plugins 以下にプラグインを導入してくれます。
README的なメッセージも現れます。

Userモデルの自動生成

表示された説明に従って、このままユーザを管理するためのモデルやコントローラ、ビューも生成してしまいます。

% script/generate authenticated user account

このscript/generateは、いろんなファイルを自動生成してくれるスクリプトで、RoRが高速開発ができるための肝です。script/generate 単体で実行すると、生成できるものの種類が分かります。なお今回プラグインを入れたため、authenticatedが追加されています。

今回は上記のコマンドで、userという名前のモデル(≒DBにアクセスするクラス)とaccountというコントローラ(≒ロジック部分)が自動的に作られます。

アプリケーション全体への認証システムの適用

ここで、app/controllers/application.rb 内に

class ApplicationController < ActionController::Base
  include AuthenticatedSystem        # 追記
  before_filter :login_from_cookie   # 追記

の二行を書き加えておくと、導入した認証システムをアプリケーション内のどこでも使えるようになります。

Usersテーブルの作成

しかしまだ肝心のDB上のテーブルが出来ていませんから、作る必要があります。

migrationファイルの確認

RoRではmigrationという仕組みを使ってテーブルを作成することができます。これを使うようにしておくと、後々テーブル構造の変更時にも便利とのこと。具体的には、db/migrate/00n_xxx.rb (00nは連番)というファイルに、DBを作るためのスクリプトを書き、rakeコマンドを実行すればOKです。


実は先ほどUserモデルを作ったときにUser用のmigrationファイルも自動生成されています。db/migrate/001_create_users.rb です。内容は下のような感じ。

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table "users", :force => true do |t|
      t.column :login,                     :string
      t.column :email,                     :string
      t.column :crypted_password,          :string, :limit => 40
      t.column :salt,                      :string, :limit => 40
      t.column :created_at,                :datetime
      t.column :updated_at,                :datetime
      t.column :remember_token,            :string
      t.column :remember_token_expires_at, :datetime
    end
  end

  def self.down
    drop_table "users"
  end
end

upメソッドがテーブルを作るメソッド、downが消すメソッドですね。
テーブルの名前は、モデルクラスの名前(User)を複数形にした users とするのがRails流らしいです。この対応付けはRails内部が自動で行うため、この規約に従う限り、ユーザが明示的に名前を設定する必要がなくなっています。

カラム(フィールド)の追加

さて、せっかくなので、usersテーブルに自己紹介を記述するカラムを追加してみます。upメソッド内のテーブル作成メソッド create_table 内の適当なところに、真似して

      t.column :profile,                     :text

と書き加えます。ちなみに string はMySQLのVARCHAR(255)に対応する型なので、255byteまでしか入りません(UTF8なので日本語だと80文字ちょっと)。:string :limit => 40ならVARCHAR(40)。一方、:textや:binaryなら任意長です。ちなみに数字は :integer、日付&時刻は :datetime、など。

テーブルの自動生成

こうしておいて、

% rake db:migrate

を実行すると、勝手にテーブルを生成してくれます。rakeコマンドは、ruby版のmakeコマンドです。

Userモデルやコントローラはは全く触ってませんが、RailsがDBのテーブルに合わせて動的にメソッドを作ってくれるので、いまのところ変更の必要はありません。

サーバの起動とユーザ認証のテスト

ここまでで、

% script/server

を実行してサーバを立ち上げ、http://127.0.0.1:3000/account/signup で新規ユーザ作成ができます。 http://127.0.0.1:3000/account/login にアクセスすると、ログイン画面が出ます。
現在、何も作っていないので、ログインすると謎のポエムが出現します。ログアウトしても出ます…。まあ、この辺の見た目(ビュー)は後々変更していきます。

URLの意味

http://127.0.0.1:3000/account/login にアクセスするときには、app/controllers/account_controller.rb 内のロジックが実行されます。メソッド名はlogin。そして、app/views/account/login.rhtml のビューの内容をもとにページをレンダリングしています。
account_controller のなかでは、Userというクラスを使ってユーザ情報にアクセスしていますが、このクラスの定義はapp/models/user.rb にあります。テーブル名やフィールド名については全く定義されていない(ただしvalidation(フィールド内容チェック)などは自動生成されている)のですが、名前を複数形にしたusersテーブルにアクセスし、動的にフィールド名は取得してくれています。
こうやって、URLや名前を対応付けることで設定を省いている、と*1

*1:URLとの関連付けは、config/routes.rbで設定されています。