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