日付入力で、携帯に対しては select box でなく input text を表示するコード

Rialsで日付入力に <%= date_select 'table', 'column' %> と書くと、年月日それぞれに select box が作られ便利なのですが、
受け取れるHTMLの大きさに制限のある携帯では、大量に <option>が送られる <select ...> ではなく、年月日 3つの <input type="text" ....>で表示した方が良い場合が多いかもしれません。


そこで、書いてみました。

module ActionView
  module Helpers
    module DateHelper
      def date_select_with_mobile(object_name, method, options = {})
        if request.mobile?
          InstanceTag.new(object_name, method, self, nil, options.delete(:object)).to_date_input_tags(options)
        else
          date_select_without_mobile(object_name, method, options)
        end
      end

      alias_method_chain :date_select, :mobile
    end

    class InstanceTag
      def to_date_input_tags(options)
        value = value(object)
        ymd = value ? value.strftime("%Y-%m-%d").split('-') : ['','','']
        tag_text = ''
        for i in 1..3
          tag_text << %!<input type="text" name="#{@object_name}[#{@method_name}(#{i}i)]" value="#{ymd[i - 1]}" size="#{i == 1 ? 4 : 2}"%> !
        end
        tag_text
      end
    end
  end
end
alias_method_chain :date_select, :mobile

と書くと、既存の date_select メソッドが date_select_without_mobile にリネームされ、上で定義した date_select_with_mobile が date_select メソッドとして再定義されます。

  • とりあえず動く程度にしか出来ていません ^^;