rails:1997
From: 山崎雄介 <y-yamasaki@s...>
Date: Tue, 06 Feb 2007 21:24:05 +0900
Subject: [rails:1997] 継承時のbefore_filterの呼び出し順序について
山崎(ゆ)です。
社内掲示板のようなアプリを作っています。
ユーザ管理画面の表示では、最大で2段階のbefore_filterが適用されるようになっ
ています。ただし、ログインしていない状態では最初のsession_authに引っかか
るので、かならずlogin画面に飛び、もうひとつが呼ばれることはないはずです。
class ApplicationController < ActionController::Base
  before_filter :session_auth, :except => [:login, :auth, :logout]
  
  def session_auth
    request_page = request.env['REQUEST_URI']
    reset_expiration
    session[:request] = request_page
    unless session[:me]
      self.class.logger.debug("session_auth_failure") # ここは呼ばれている。
      flash[:notice] = 'ログインして下さい。'
      redirect_to :action => 'login'
    else
      @me = session[:me]
    end
  end
end
class UserController < ApplicationController
  before_filter :reject_user, :only => [:list]
  
  def reject_user
    self.class.logger.debug("reject_user") # 呼ばれてはいけないのに呼ばれる。
    raise unless @me.manager
  end
  
  def login
    self.class.logger.debug("login") # ここは呼ばれない。
    @user = User.new :mail => session[:mail]
    raise params[:error].to_s unless session[:me]
    redirect_to :action => 'index'
  rescue => err
    flash[:notice] = err.message
  end
end
ところが実際、ログインしていない状態で、
http://localhost:3000/user/list
を呼ぶと、login は呼ばれず、先にlist -> reject_user と呼ばれてしまいます。
ログインしていないので、誰をrejectしてよいかわからずエラーになります。
下位クラスのbefore_filterが先に呼ばれているんじゃないでしょうか。
Rails1.6.0のときは問題なかったような気がするんですけど、なにかの勘違いで
すかねぇ。
Ruby version                 1.8.5 (i386-mswin32)
RubyGems version             0.9.0
Rails version                1.2.1
Active Record version        1.15.1
Action Pack version          1.13.1
Action Web Service version   1.2.1
Action Mailer version        1.3.1
Active Support version       1.4.0
Application root             C:/rails/infocard
Environment                  development
Database adapter             sqlite3
Database schema version      8
GetText version              1.9.0
_______________________
Yusuke Yamasaki <y-yamasaki@s...>
--
ML: rails@r...
使い方: http://QuickML.com/
-> 1997 2007-02-06 13:24 [y-yamasaki@s... ] 継承時のbefore_filterの呼び出し順序について 1998 2007-02-06 14:19 ┗[moriq@m... ] 1999 2007-02-06 16:38 ┗[y-yamasaki@s... ]