jpmobile 2.0.5でsession_storeを指定するときの注意

いつもjpmobileにはお世話になっております^^

今回、Rails 3.1.0 + Devise 1.5.0 + jpmobile 2.0.5の環境下で、mobileのときにURLに自動付与されるsession_idがおかしな値になり、ログインできない現象に見舞われました。
環境は以下の通りです。

* Rails 3.1.0
* Devise 1.5.0
* jpmobile 2.0.5
* sessionはActiveRecordStore

jpmobile 2.0.4のときはうまく動いていたので、diffを調べていたら、memcache storeをサポートした際の変更が原因でした。

https://github.com/jpmobile/jpmobile/commit/36a84626a6ed0a0564e59cff8db20e1ad42d2508

    case Rails.application.config.session_store.to_s
    when "ActionDispatch::Session::MemCacheStore"
      require 'jpmobile/session/mem_cache_store'
      ActionDispatch::Session::MemCacheStore.send :include, ParamsOverCookie
    when "ActiveRecord::SessionStore"
      require 'jpmobile/session/active_record_store'
      ActionDispatch::Session::AbstractStore.send :include, ParamsOverCookie
    end

この部分で、SessionStoreを判別して処理を分けているので、つまり、このコードが呼ばれる前に Rails.application.config.session_store を設定する必要があります

今回、以下のようなファイル名だったため、順番が逆で、jpmobileの初期化コードが正しく呼ばれていませんでした。

config/initializers/jpmobile_init.rb で、

require 'jpmobile'
MyApp::Application.config.jpmobile.mobile_filter
MyApp::Application.config.jpmobile.form_accept_charset_conversion = true

config/initializers/session_store.rb で、

MyApp::Application.config.session_store :active_record_store
MyApp::Application.config.session_options = {:cookie_only => false}

手っ取り早い解決法として、session_store.rbをasession_store.rbにリネームすることにしました。

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

baba

ゆとりプログラマー。 高校時代から趣味でプログラミングを初め、そのままコードを書き続けて現在に至る。慶應義塾大学環境情報学部(SFC)卒業。BPS設立初期に在学中から参加している最古参メンバーの一人。得意分野はWeb全般、Ruby on Rails、Androidアプリケーションなど。最近はBlinkと格闘中。軽度の資格マニアで、情報処理技術者試験(高度10区分)などを保有。

babaの書いた記事

週刊Railsウォッチ

インフラ

Rubyスタイルガイドを読む

BigBinary記事より

ActiveSupport探訪シリーズ