【前回の記事】で「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]
)
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 件のコメント:
コメントを投稿