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... ]