RoRでCGMサイト構築虎の巻

第6回 ユーザーの満足度を向上させるプラグイン活用

小椋 隆史
株式会社Cuon

2009/9/9

Rubyを使った大規模エンタープライズ開発が始まっている。Ruby on Railsでの開発において、インフラやアプリケーションアーキテクチャをどのように構成すべきかを考える(編集部)

 第5回「"最適な"全文検索システムの選択」では、闘病記を中心としたCGM(Consumer Generated Media)サイトである「LifePalette」で採用した全文検索エンジンの選定過程を紹介した。

 「RoRでCGMサイト構築虎の巻」の最終回となる今回は、Ruby on Rails(RoR)のプラグインを活用して、Webサイト全体のサービス向上を図る際のポイントについて触れたい。

 具体的には、LifePaletteのモバイルサイト化において直面した問題の改善方法と、第5回でも触れた「Apache Solr」と「Apache Lucene」を利用した柔軟な全文検索システムやOpenIDの導入など、今後取り組む予定の技術について紹介する。

 jpmobileでモバイルサイト構築

 LifePaletteのモバイル版を作成するにあたり、定番プラグインであるjpmobileを導入した。これにより、絵文字などの対応は、特に意識することなくマルチキャリア対応ができた。

 しかし、ログイン処理において引っかかることになる。

 今回のモバイルサイトの作りは、会員制のPCサイトと同様のHTTPとHTTPSを相互にまたぐフローとして設計していた。ここで携帯特有の問題に当たってしまう。

 Cookieは当然使わないようにするのだが、端末によっては発行されていれば無条件に受け入れる設定になっているものもある。この場合、Cookieにkeyが設定されており、jpmobileのinitialize処理でURLからセッションIDを復元したいところにうまく入ってくれない。

●Jpmobile/lib/jpmobile/trans_sid.rb
  def initialize(cgi, options = {})
    key = option[‘session_key’]
    if cgi.cookies[key].empty? # ここの判定を抜けてしまう
      session_id = (CGI.parse(cgi.env_table[‘RAW_POST_DATA’])[key] rescue nil) ||
      cgi.params[key] = session_id unless session_id.blank?
    end
    initialize_without_session_key_fixation(cgi, options)
  end

 そこで、trans_sidが指定されているところについて、無条件にCookieの値を捨てるように以下のようなモンキーパッチを作成した。これをApplicationControllerにrequireさせることで、trans_sidメソッドにcookie_modeという第2引数を追加した。第2引数に「:ignore_cookie」を指定することで、Cookie使用可能環境であってもクエリストリングからセッション復元を行う。

●lib/patched_jpmobile.rb
# Jpmobileのtrans_sidメソッドにcookieを無視するフラグを追加
class ActionController::Base #:nodoc:
  class_inheritable_accessor :ignore_cookie_mode
  class << self
    def trans_sid(mode=:mobile, cookie_mode=:use_cookie)
      include Jpmobile::TransSid
      self.trans_sid_mode = mode
      self.ignore_cookie_mode = cookie_mode
      unless mode == :none
        # CSRF対策への対策
        session :cookie_only => false
        # url/postからsession_keyを取得できるようhookを追加する
        unless ::CGI::Session.private_method_defined?(:initialize_without_session_key_fixation)
          ::CGI::Session.class_eval do
            alias_method :initialize_without_session_key_fixation, :initialize

            # jpmobileのCookie使用モードを保持するクラス変数を追加
            class_inheritable_accessor :jpmobile_cookie_mode
            self.jpmobile_cookie_mode = cookie_mode
            
            def initialize(cgi, options = {})
              key = options['session_key']
              # jpmobileのCookie使用モードが :ignore_cookie のときはCookieに
              # 含まれるセッションキーではなく、クエリストリングに含まれるセッションキー
              # を優先する
              if cgi.cookies[key].empty? || jpmobile_cookie_mode == :ignore_cookie
                session_id = (CGI.parse(cgi.env_table['RAW_POST_DATA'])[key] rescue nil) ||
                  (CGI.parse(ENV['QUERY_STRING'] || cgi.query_string)[key] rescue nil)
                cgi.params[key] = session_id unless session_id.blank?
              end
              initialize_without_session_key_fixation(cgi, options)
            end
          end
        end
      end
    end
    alias :transit_sid :trans_sid
  end
end

module Jpmobile::TransSid #:nodoc:
  def apply_trans_sid?
    return false unless session_enabled?
    return false if trans_sid_mode == :none
    return true if trans_sid_mode == :always
    if trans_sid_mode == :mobile
      if request.mobile?
        return true if ignore_cookie_mode == :ignore_cookie
        return !request.mobile.supports_cookie?
      else
        return false
      end
    end
    return false
  end
end

 そもそもモバイルサイトの作りとして、HTTPとHTTPSをまたぐようなサービス構成が正しかったのかという問題や、Webサーバ周りの設定不備の可能性もある。しかし、アプリケーション側でこのような形で対応できるということは、なにがしかの参考にはなるかもしれない。Webサービスにおいてモバイルサイトへの展開は普通に意識されるものなので注意していく必要があるだろう。

 
1/2

Index
ユーザーの満足度を向上させるプラグイン活用
 Page1
jpmobileでモバイルサイト構築
  Page2
柔軟な全文検索の実現:Apache Solr
acts_as_solrとFlare
ユーザー流入への「お試しサービス」の布石:OpenID

index RoRでCGMサイト構築虎の巻

 Ruby/Rails関連記事
プログラミングは人生だ
まつもと ゆきひろのコーディング天国
 ときにプログラミングはスポーツであり、ときにプログラミングは創造である。楽しいプログラミングは人生をより実りあるものにしてくれる
生産性を向上させるRuby向け統合開発環境カタログ
Ruby on Rails 2.0も強力サポート
 生産性が高いと評判のプログラミング言語「Ruby」。統合開発環境を整えることで、さらに効率的なプログラミングが可能になる
かんたんAjax開発をするためのRailsの基礎知識
Ruby on RailsのRJSでかんたんAjax開発(前編)
 実はAjaxアプリケーション開発はあなたが思うよりも簡単です。まずはRuby on Railsの基礎知識から学びましょう
Praggerとnetpbmで作る画像→AA変換ツール
Rubyを使って何か面白いものを作ってみよう!
 一般的な画像をアスキーアートに変換するツールを作ってみる。さらに出力にバリエーションを持たせてみよう
コードリーディングを始めよう
Railsコードリーディング〜scaffoldのその先へ〜(1)
 優れたプログラマはコードを書くのと同じくらい、読みこなす。優れたコードを読むことで自身のスキルも上達するのだ
  Coding Edgeフォーラムフィード  2.01.00.91


Coding Edge フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

>

Coding Edge 記事ランキング

本日 月間