restful-authentication + aasm + forgot_passwordでWebアプリの骨を作る

今日は
railsを使ってWebアプリを作ろう、という時、まずは何から作り始めますか?
まずユーザ登録周りのところまではほぼ自動で作ってしまいましょうか。』
という趣旨のエントリーです。

手順は下記2つのURLを参考というか、コピペさせてもらいました。
restful-authentication プラグインを使ってログインアプリケーション作る(1)
restful-authenticationの使い方 基本編

おおまかに言うと下記4つの手順があります。

  1. rails 2.3.2でプロジェクトを作る
  2. restful_authentication, aasm, forgot_passwordのプラグインを入れる
  3. プログラムを自動生成する
  4. プログラムに少し追記する


(1)まずはプロジェクトを作成

rails project_name
cd project_name


(2−1)作ったプロジェクトにrestful-authenticationプラグインをインストール

ruby script/plugin install git://github.com/technoweenie/restful-authentication.git

※※※※※
ちなみにgitがインストールされていない場合、エラーは出ないけど、プラグインもインストールされない、という状態になるので注意しましょう。MacPortsで入れる場合は下記のような感じです。

sudo port install git-core +svn +doc +bash_completion

※※※※※


(2−2)aasmプラグインをインストール
aasmはacts_as_state_machineの略です。ユーザーの登録状態を切り替えるところで使います。

gem sources -a http://gems.github.com
gem install rubyist-aasm


(2−3)パスワード忘れ対策プラグインのインストール

ruby script/plugin install git://github.com/greenisus/forgot_password.git


(3)ユーザ登録、ログイン、パスワード忘れ、のコードを生成

ruby script/generate authenticated user sessions --include-activation --aasm
ruby script/generate forgot_password password user


(4−1)routes.rbの編集
config/routes.rb

map.activate '/activate/:activation_code', :controller => 'users', :action => 'activate', :activation_code => nil
map.resources :users, :member => { :suspend => :put, :unsuspend => :put, :purge => :delete }

activateのmapを追記し、usersのresources指定にaasmで利用するアクションをmemberで追加します。


(4−2)ログイン関連の修正
app/controllers/applications.rbでAuthenticatedSystemをincludeします。

include AuthenticatedSystem

代わりにusers_controller.rbとsessions_controller.rbからは

include AuthenticatedSystem

を削除しましょう。

次はloginが必要なアクションにフィルタを設定します。
app/controllers/users_controller.rb
に下記を追記。

  before_filter :login_required, :except => [ :new,
                                              :create,
                                              :activate,
                                              :suspend,
                                              :unsuspend,
                                              :destroy,
                                              :purge,
                                            ]

sessions_controller.rb は認証が必要ないため、skip_before_filter を設定しておきます。
app/controllers/sessions_controller.rb

  skip_before_filter :login_required


(4−3)aasmの読み込み
vendor/plugins/restful-authentication/rails/init.rb
に下記を追加します。

require 'aasm'
require File.join(File.dirname(__FILE__), "..", "lib", "authorization", "aasm_roles")


(4−4)設定ファイルの修正
config/environment.rb の Rails::Initializer.run のブロック内に

  config.active_record.observers = :user_observer

  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    :address => 'SMTP サーバ',
    :port => 587, # or 25
    :domain => 'ドメイン',
    :authentication => :login,
    :user_name => 'SMTP AUTH ユーザーID',
    :password => 'SMTP AUTH パスワード'
  }

と記述します。(設定の値は適切なものに変更する必要があります。)
また、config/preinitializer.rb というファイルを作成して

AppConfig = { 
  :admin_email => '何らかのメールアドレス',
  :service_url => 'http://localhost:3000'
}

と記述します。(何らかのメールアドレス、の部分は適切なものに変更する必要があります。)


(4−5)メールアドレスとURLの設定

app/models/user_mailer.rb と app/models/password_mailer.rb の中で

  • "ADMINEMAIL" という記述は AppConfig[:admin_email] に置換します。
  • http://YOURSITE という記述は #{AppConfig[:service_url]} に置換します。

app/models/user_mailer.rb

    @body[:url]  = "#{AppConfig[:service_url]}/activate/#{user.activation_code}"

    @body[:url]  = "#{AppConfig[:service_url]}"

    @from        = AppConfig[:admin_email]

app/models/password_mailer.rb

    @body[:url]  = "#{AppConfig[:service_url]}/change_password/#{password.reset_code}"

    @from        = AppConfig[:admin_email]


(4−6)トップページ用のコントローラーを作成
config/routes.rbでコメントアウトされている下記の行を有効にする

map.root :controller => "welcome"

index.htmlを削除してwelcomeコントローラーを作成

rm public/index.html
ruby script/generate controller welcome

app/controllers/welcome_controller.rbにlogin_requiredのフィルターを指定します。

class WelcomeController < ApplicationController
  before_filter :login_required
end

app/views/welcome/index.html.erbを作成し、下記のコードを書いておきます。

<%= flash[:notice] %>


以上で完了です。

会員登録のアクションは下記です。

http://localhost:3000/signup

会員登録後、ルートのURL(http://localhost:3000/)にアクセスするとログインフォームに飛ばされます。
そのままログインして「ログイン成功したよー」的なメッセージが表示されればOKです。