イメージ画像

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 レベルでエラーが出ていたので、上記の実装にした。

 

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

タグ

2012年1月14日 | コメント/トラックバック(0) |

カテゴリー:Ruby on Rails

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ