Railsの2.3と3.0でセッション共有
http://d.hatena.ne.jp/conceal-rs/20090818/1250569372 を参考にした。
リンク先にもある通り、それぞれのアプリケーションで存在しないクラスがある場合に Marshal.load でエラーになる。
具体的には
ActionController::Flash::FlashHash : 2.3には存在するが、3.0 には存在しない
ActionDispatch::Flash::FlashHash : 2.3には存在しないが、3.0には存在する
それぞれで表示した flash メッセージが相手側のセッションで Marshal.load する際にエラーになる。
Marshal.load にパッチを当てようと思ったが、Marshal は組み込みライブラリのため、パッチが当てられない。
Marshal の代わりに YAML や JSON のシリアライズも試したけど、シリアライズするオブジェクトがHash のサブクラスの場合、 Hashオブジェクトとしてシリアライズされてしまった。
最終的に
class ActionController::Flash::FlashHash < ActionDispatch::Flash::FlashHash def unused true end end class ActiveRecord::SessionStore::Session def self.unmarshal(data) session = Marshal.load(ActiveSupport::Base64.decode64(data)) session.each{|k, v| session.delete(k) if v.respond_to?(:unused)} end end
として initializer に入れた。
先にあげたリンク先では unused のチェックを ApplicationController で行っているが、rack レベルでエラーが出ていたので、上記の実装にした。
タグ
2012年1月14日 | コメント/トラックバック(0) |
カテゴリー:Ruby on Rails


