概要
XenなVPSサーバを借りたので、Ruby on Railsを入れて遊んでみている。買った本は2冊。
2週間くらいつらつらといぢってみたが色々できるようになってきたので、携帯からアクセスしてあそんでみた。が、DoCoMoのSO902iはCookieに対応していないのでセッションが使えない。
いろいろぐぐってみたところ、ActiveHeartなんてのを使うとURLにセッションIDを仕込んで、Cookieの代わりにGETでセッションIDを引き継いでいけばよいらしい。で、やってみたけれども引継ぎがうまくいっていない。
一応解決したので書いておく。
状況
テストなのでアプリのディレクトリの「config/environment.rb」で、「require File.join(File.dirname(__FILE__), 'boot')」の後に以下のように直接書いてActiveHeartを有効にした。
# Bootstrap the Rails environment, frameworks, and default configuration
require File.join(File.dirname(__FILE__), 'boot')
ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS[:trans_sid] = true
Rails::Initializer.run do |config|
# Settings in config/environments/* take precedence over those specified here
PCのFirefoxからアクセスしてみると、リンク部分に「?_session_id=XXXXX」が追加されている。リンクをたどった先のページにあるリンクにも同じIDが追加されていた。セッションを利用したログインもうまく動いている。
うまくいっていそうなので携帯からアクセスしてみる。・・・と、ログインできない。URLを確認しながらリンクをたどってみると、毎回違うIDがURLについていた。
FOMAだとアクセスするたびにIPアドレスが変わるからRailsで同一セッションとして扱われない?とか、実はGETしたセッションIDをRails側のセッションに渡してやるコードを別で書かないとだめ?とか二日くらい悩んだ。
ためしにPCのFirefoxでCookieを無効にしてアクセスしてみると、URLに「?_session_id=XXX」が付いた状態でリロードしながらソースを見てみると、リンクについたセッションIDがころころ変わっていた。
URL「http://XXX.XXXXXXXX.jp/XXX?_session_id=f00d3c3b23e2c1bbab55f54937fa8ccb」にアクセスし、受信したページのソースを見てみると、リンク部分が「href="/add_person/XXX?_session_id=f97115464ef3e5a9903c8f707e6d09bf"」とかになってる状態。
暫定対処
さらに一日くらい悩んだあげく、セッションキーが「_session_id」じゃないんじゃないか?ってことに思い当たってソースをgrepしまくってみる。すると「/usr/lib64/ruby/gems/1.8/gems/rails-1.2.2/helpers/application.rb」に
session :session_key => '_<%= app_name %>_session_id'
なんて書いてあるわけで。しかもよく見たら、「app/controllers/application.rb」には
class ApplicationController < ActionController::Base
# Pick a unique cookie name to distinguish our session data from others'
session :session_key => '_アプリ名_session_id'
end
なんて書いてあったりするわけで。
ためしに「app/controllers/application.rb」の「_アプリ名_session_id」を「_session_id」に書き換えてみると、セッションIDが変わらなくなった。携帯からでも問題なし。
ActiveHeartは結構古いみたいだし、Ruby on Railsのバージョン1.2は出たばっかりみたいだし。バージョンアップで変更された部分の違いなのかな?ActiveHeart側でセッションキー名を取得して、無かったら_session_idを定義してるっぽい書き方になっているのが効いてないっぽい。
まぁとりあえずセッションキーを合わせれば動作することがわかったので、暫定対応としては良しとしてみる。
残課題
Ruby on Rails的に正しい対処ってどうするのかなぁ

コメントする