私の Rails 3.1 アプリでは、アクセスを検証するために Rack Middleware を作成しました。アクセスが承認されない場合、ユーザーはページにリダイレクトされます。具体的には、ビューに既にあるページになります。routes.rb で次のように定義して、dummy.html.erb にリダイレクトしようとしているとします。
match '/dummy', to :'page#dummy'
ページが私のコントローラーです。
次のことを試しましたが、リダイレクト ループに陥っているようです。
/lib にある My Rack ミドルウェア:
class AccessVerifier
def initialize(app)
@app = app
end
def call (env)
#....
#....do some type of verification here and redirect if fail verification
#....
[301, {"Location" => '/dummy', "Content-Type" => "text/html"}, []]
end
end
application.rb には
config.autoload_paths += %W(#{config.root}/lib)
config.middleware.use "AccessVerifier"
また、ミドルウェアでコントローラーを呼び出してみましたが、やはりリダイレクト ループに陥っています。次のように、ミドルウェア クラスからコントローラーを呼び出しました。
def call (env)
...
status,headers,response=PageController.action("validateAccess").call(env)
end
そして私のコントローラーで:
class PageController < ApplicationController
def validateAccess
redirect_to :controller => 'page', :action => "dummy"
end
...
end
Rack ミドルウェアを使用せずに、たとえばコントローラーのみを使用してリダイレクトが正常に行われるのを見てきましたが、アプリケーションを実行する前にミドルウェアでこれを行う必要があることに注意してください。