2010/04/15

各namespace でapplication_controller みたいな仕組みを作る

スカイプ英会話のカフェトークでは生徒、講師、管理者でそれぞれネームスペースをもってるんですが、各ネームスペースで application_controller のように、一つの親コントローラに共通メソッドをまとめたいと思いました。 まず、application_controller.rb に全てで使う共通メソッドなどを入れる。
class ApplicationController < ActionController::Base
  include SslRequirement              
  before_filter :set_user_language    
  before_filter :set_timezone

  def set_timezone
    Time.zone = session[:tz] if session[:tz]
  end
   
  private
  def set_user_language
    I18n.locale = params[:locale] || 'ja'
  end
   
end
次に、例えば管理者 admin ネームスペースで使うルートコントローラを作る (admin_root_controller.rb)
class AdminRootController < ApplicationController
  ssl_required :all
  before_filter :authenticate_admin
  before_filter :admin_login_required
  
  def admin_login_required
    if session[:admin_id]
      return true 
    else
      flash[:warning]= t('common.please_login')
      unless request.request_uri == "/admin/login/logout"
        session[:return_to_path] = request.request_uri
      end
      redirect_to :controller => "admin/login", :action => "index"
      return false
    end
  end

  def authenticate
    authenticate_or_request_with_http_basic do |username, password|
      username == "xxxxx" && password == "xxxxxxxxxxxx"
    end
  end

  protected
  def ssl_required?
    Rails.env.production? #本番環境以外はSSL しない
  end

end
最後に普通のコントローラー
class Admin::LoginController < AdminRootController
  layout 'admin'
  skip_before_filter :admin_login_required

  def logout
    
  end

  def login

  end

end
こんな感じ・・・

0 件のコメント: