2008-05-25 Ruby on Railsで延々作るTwitterもどき - 1日目
ユーザ認証用のプラグインの導入とテーブルの生成
普通なら、ここで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テーブルにアクセスし、動的にフィールド名は取得してくれています。
- 105 http://www.google.co.jp/search?q=rails+ユーザ認証&sourceid=navclient-ff&ie=UTF-8&rlz=1B2GGGL_jaJP205JP205&aq=t
- 70 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=L5q&q=openInfoWindowHtml+width+margin&btnG=検索&lr=
- 64 http://www.google.co.jp/search?hl=ja&q=rails+ユーザ一覧&btnG=検索&lr=
- 24 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GZAZ_jaJP243JP244&q=macbook+再起動 ショートカット
- 23 http://www.google.co.jp/url?sa=t&rct=j&q=rails ユーザ認証&source=web&cd=2&ved=0CC0QFjAB&url=http://d.hatena.ne.jp/NeoCat/20080525/1211653603&ei=r1uhTpC3A8LymAWKr42hCQ&usg=AFQjCNGttklcEzP4HqSZmP9LhpU4Yv--zA&
- 22 http://www.google.co.jp/search?hl=ja&source=hp&q=rails+ユーザ認証&lr=&aq=0r&oq=rails+ゆー
- 21 http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=rails+twitter+もどき
- 17 http://b.hatena.ne.jp/
- 13 http://b.hatena.ne.jp/entrylist?sort=hot
- 13 http://d.hatena.ne.jp/elm200/20070316/1174044163



