2011年2月24日木曜日

ActionDispatch::Session::CookieStore RuntimeError

になって困ってたんですよね。

前回の記事】で「Flashからのセッション情報を gem で解決する」と記述しましたが、どうもこれがうまく動かないときがあるので、やっぱりRackミドルウェアとして実装することにしたのです。

まずは app/middleware/flash_session_cookie_middleware.rb:


require 'rack/utils'


class FlashSessionCookieMiddleware
  def initialize app, session_key="_session_id"
    @app = app
    @session_key = session_key
  end


  def call(env)
    if env["HTTP_USER_AGENT"] =~ /^(Adobe|Shockwave) Flash/
      req = Rack::Request.new(env)
      env["HTTP_COOKIE"] = [@session_key, req.params[@session_key]].
                            join("=").freeze unless req.params[@session_key].nil?
      env["HTTP_ACCEPT"] = "#{req.params['_http_accept']}".
                           freeze unless req.params['_http_accept'].nil?
    end


    @app.call(env)
  end
end

次は config/application.rb:

# Custom directories with classes and modules you want to be autoloadable.
config.autoload_paths += %W(#{config.root}/app/middleware)

最後に config/initializers/session_store.rb:



MyApplication::Application.config.session_store :active_record_store, :key => '_MyApplication_session'


Rails.application.config.middleware.insert_before(
  ActionDispatch::Session::CookieStore,
  FlashSessionCookieMiddleware,
  Rails.application.config.session_options[:key]
)

としたんですが、どうも「ActionDispatch::Session::CookieStoreなんてミドルウェアは知らないよ」と、タイトルにもあるとおりRuntimeErrorを吐かれてサーバが起動できない。散々調べた結果、収穫はゼロ。このエラーに悩まされているのは世界中でボク一人だったようで、なんとも。

で、試しに :active_record_store から :cookie_store に戻してみたんですよね。

MyApplication::Application.config.session_store :cookie_store, :key => '_MyApplication_session'


Rails.application.config.middleware.insert_before(
  ActionDispatch::Session::CookieStore,
  FlashSessionCookieMiddleware,
  Rails.application.config.session_options[:key]
)

動きました。どうやらこいつが原因だったみたいですが…それでも :active_record_store で Uploadify なんかを使っている人は多いと思うんですよね。

新しくアプリケーションを作成したときにこのエラーが発現するのかどうかが気になるところですが、もうなんか疲れたのでこれまで、ということで。気が向いたら RailsTalk に投稿するかも知れませぬ。

0 件のコメント:

コメントを投稿