Hatena::ブログ(Diary)

ハードコアシステム開発

2008-02-12

携帯用に入力モード指定ヘルパー

| 19:20

mobile on railsというプラグインを入れてみたけど、これはとても便利。しかし、これには携帯の入力モードを指定できるようなコードは無かったっぽいので、その辺りを自作。

http://www.amazon.co.jp/exec/obidos/ASIN/4274066967/100hardco-22/ref=nosim/

22.6 カスタムフォームビルダーを参考に作ってみた。

まず、app/helpers/mobile_tag_builder.rbというファイルを作成して、中身を下記のように記述

class MobileTagBuilder < ActionView::Helpers::FormBuilder

  def text_field (field, options = {})
    if options.has_key?(:mobile_input_style)
      if @template.controller.request.mobile_carrier == ActionController::Mobile::DoCoMo
        options[:istyle] = mobile_input_style_by_carrier(options[:mobile_input_style]);
      elsif @template.controller.request.mobile_carrier == ActionController::Mobile::AU
        options[:istyle] = mobile_input_style_by_carrier(options[:mobile_input_style]);
      elsif @template.controller.request.mobile_carrier == ActionController::Mobile::SoftBank
        options[:mode] = mobile_input_style_by_carrier(options[:mobile_input_style]);
      end
      options.delete(:mobile_input_style)
    end

    super(field, options)
  end
  
  private
  def mobile_input_style_by_carrier (input_style)
    # ひらがな
    if input_style == :input_style_hiragana
      if @template.controller.request.mobile_carrier == ActionController::Mobile::SoftBank
        :hiragana
      else
        :'1'
      end

    # カタナカ
    elsif input_style == :input_style_katakana
      if @template.controller.request.mobile_carrier == ActionController::Mobile::SoftBank
        return :katakana
      else
        :'1'
      end

    # 半角カタナカ
    elsif input_style == :input_style_hankakukana
      if @template.controller.request.mobile_carrier == ActionController::Mobile::SoftBank
        :hankakukana
      else
        :'2'
      end

    # 英字
    elsif input_style == :input_style_alphabet
      if @template.controller.request.mobile_carrier == ActionController::Mobile::SoftBank
        :alphabet
      else
        :'3'
      end

    # 数字
    elsif input_style == :input_style_numeric
      if @template.controller.request.mobile_carrier == ActionController::Mobile::SoftBank
        :numeric
      else
        :'4'
      end

    # なんでも
    elsif input_style == :input_style_any
      if @template.controller.request.mobile_carrier == ActionController::Mobile::SoftBank
        :any
      else
        :'1'
      end

    # メールアドレス
    elsif input_style == :input_style_emailaddr
      if @template.controller.request.mobile_carrier == ActionController::Mobile::SoftBank
        :emailaddr
      else
        :'3'
      end
      
    # 電話番号
    elsif input_style == :input_style_phonenumber
      if @template.controller.request.mobile_carrier == ActionController::Mobile::SoftBank
        :phonenumber
      else
        :'4'
      end

    # url
    elsif input_style == :input_style_url
      if @template.controller.request.mobile_carrier == ActionController::Mobile::SoftBank
        :url
      else
        :'3'
      end
    end
  end
end

ソフトバンクの入力モードの指定が一番多いので、それを基準にして、ドコモAUマッピング

requestオブジェクトをどうやって参照すれば良いのかちょい悩んだが、@templateインスタンス経由でアクセスできた。これは素直に本読めば普通に書いてある事だった。

とりあえず、このあとはビューで、下記のようにして呼び出し

<% form_for :signup, :url => { :action => :signup }, :builder => MobileTagBuilder do |form| %>
<%= form.text_field :email, :size => 20, :maxlength => 255, :mobile_input_style => :input_style_alphabet %>

これが正しいやり方なのかどうか分からないけど、とりあえず動いているみたい。絶対ruby的な書き方じゃないだろうし…

なぜSymbolを使うのか

| 19:40

よく分からないままrails流儀に従って:foobarとかやってたので、調べてみた。こういう事らしい。つまりは同じ文字列何個も作る度にメモリを確保しないようにする。従ってメモリが節約される。

rakutorakuto 2008/02/16 10:55 はじめまして。rakutoと申します。
Mobie on Railsを作成した者ですが、現状、携帯サイト開発から離れていてメンテナンスができていない状態です。Mobile on RailsのレポジトリをRuby Forgeに移行したのでコミッタとして参加いただけますでしょうか?

http://rubyforge.org/projects/mor/
http://mor.rubyforge.org/svn/trunk/

手順はRuby Forgeでアカウントを作成し、作成完了したらrakuto@gmail.comまでアカウント名をお伝えいただければと思います。

よろしくお願いいたします。

hardcore100hardcore100 2008/02/19 11:40 メールしました。おてすきのときで結構ですのでご連絡ください。