日常茶飯事的 Rails スケルトン

restful-authentication プラグインを使ってログインアプリケーション作る(1)
screenshot

restful-authentication プラグインを使ってログインアプリケーション作る(2)
screenshot

の内容と
screenshot

の内容をあわせたもの。
両サイトに多謝!!!

私オリジナルでは、ありませんよ!!

プロジェクトの作成

% rails sample

各種プラグイン

restful-authentication
% ruby script/plugin install git://github.com/technoweenie/restful-authentication.git
aasm
% ruby script/plugin install git://github.com/rubyist/aasm.git
forgot_password
% ruby script/plugin install git://github.com/greenisus/forgot_password.git

Generate

sessions_controller と user モデルを作成
% ruby script/generate authenticated user sessions --include-activation --aasm
passwords_controller と password モデルを作成
% ruby script/generate forgot_password password user

ソースの編集

vendor/plugins/restful-authentication/init.rb
require File.dirname(__FILE__) + '/lib/authentication'
require File.dirname(__FILE__) + '/lib/authentication/by_password'
require File.dirname(__FILE__) + '/lib/authentication/by_cookie_token'
require 'aasm'
require File.dirname(__FILE__) + '/lib/authorization/aasm_roles'
config/routes.rb
(省略)
  map.activate '/activate/:activation_code', :controller => 'users', :action => 'activate'
(省略)
config/environment.rb
(省略)
Rails::Initializer.run do |config|
(省略)
  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 パスワード'
  }
end

$ADMIN_EMAIL = '管理者のメールアドレス'
$SERVICE_URL = 'http://localhost:3000'
app/models/user_mailer.rb
class UserMailer < ActionMailer::Base
  def signup_notification(user)
    setup_email(user)
    @subject    += 'Please activate your new account'

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

  end

  def activation(user)
    setup_email(user)
    @subject    += 'Your account has been activated!'
    @body[:url]  = "#{$SERVICE_URL}"
  end

  protected
    def setup_email(user)
      @recipients  = "#{user.email}"
      @from        = $ADMIN_EMAIL
      @subject     = "[YOURSITE] "
      @sent_on     = Time.now
      @body[:user] = user
    end
end
app/models/password_mailer.rb
class PasswordMailer < ActionMailer::Base

  def forgot_password(password)
    setup_email(password.user)
    @subject    += 'You have requested to change your password'
    @body[:url]  = "#{$SERVICE_URL}/change_password/#{password.reset_code}"
  end

  def reset_password(user)
    setup_email(user)
    @subject    += 'Your password has been reset.'
  end

  protected
    def setup_email(user)
      @recipients  = "#{user.email}"
      @from        = $ADMIN_EMAIL
      @subject     = "[YOURSITE] "
      @sent_on     = Time.now
      @body[:user] = user
    end
end
app/controllers/application.rb
class ApplicationController < ActionController::Base

(省略)
  include AuthenticatedSystem

  before_filter :login_required

end
app/controllers/users_controller.rb
class UsersController < ApplicationController
  before_filter :login_required, :except => [ :new,
                                              :create,
                                              :activate,
                                              :suspend,
                                              :unsuspend,
                                              :destroy,
                                              :purge,
                                            ]

(省略)

end
app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
  skip_before_filter :login_required

(省略)

end

ここで簡単なアプリを作るとよい
つまりscaffold

データベースとテーブルの作成
% rake db:create

% rake db:migrate

ここまでで確認

メールアドレス変更

change_email
% ruby script/plugin install git://github.com/kusakari/change_email.git
valid-attributes
% ruby script/plugin install git://github.com/kusakari/valid_attributes.git
メールアドレス変更用のコードを自動生成
% ruby script/generate change_email email user
データベース
% rake db:migrate

メールの日本語対応

ActionMailerJa
% ruby script/plugin install git://github.com/kusakari/actionmailer_ja.git
app/models/user_mailer.rb
class UserMailer < ActionMailer::Base
  def signup_notification(user)
    setup_email(user)
    @subject    += '新しいアカウントを有効にして下さい'

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

  end

  def activation(user)
    setup_email(user)
    @subject    += 'アカウントが有効になりました'
    @body[:url]  = "#{$SERVICE_URL}"
  end

  protected
    def setup_email(user)
      @recipients  = "#{user.email}"
      @from        = "TODOアプリケーション <#{$ADMIN_EMAIL}>"
      @subject     = "[YOURSITE] "
      @sent_on     = Time.now
      @body[:user] = user
    end
end

エラーの日本語化

screenshot