restful-authentication + aasm + forgot_passwordでWebアプリの骨を作る
今日は
『railsを使ってWebアプリを作ろう、という時、まずは何から作り始めますか?
まずユーザ登録周りのところまではほぼ自動で作ってしまいましょうか。』
という趣旨のエントリーです。
手順は下記2つのURLを参考というか、コピペさせてもらいました。
restful-authentication プラグインを使ってログインアプリケーション作る(1)
restful-authenticationの使い方 基本編
おおまかに言うと下記4つの手順があります。
- rails 2.3.2でプロジェクトを作る
- restful_authentication, aasm, forgot_passwordのプラグインを入れる
- プログラムを自動生成する
- プログラムに少し追記する
(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です。