第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を復元したいところにうまく入ってくれない。
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使用可能環境であってもクエリストリングからセッション復元を行う。
# 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 |
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) 優れたプログラマはコードを書くのと同じくらい、読みこなす。優れたコードを読むことで自身のスキルも上達するのだ |
|
- プログラムの実行はどのようにして行われるのか、Linuxカーネルのコードから探る (2017/7/20)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。最終回は、Linuxカーネルの中では、プログラムの起動時にはどのような処理が行われているのかを探る - エンジニアならC言語プログラムの終わりに呼び出されるexit()の中身分かってますよね? (2017/7/13)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、プログラムの終わりに呼び出されるexit()の中身を探る - VBAにおけるFileDialog操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法 (2017/7/10)
指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは (2017/7/6)
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり
|
|