それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ruby で URL をパースしてGET引数をHashに展開する。(日本語URI対応)

GET引数をハッシュに変えたい

実は、頻繁にやるんだけど、毎回適当に行っていて、これといった方法を決めてなかったので、ちゃんと方法を決めることにする。

require 'uri'


module URI
  class << self
    alias :_parse :parse

    def parse a, original=false
      return self._parse a if original

      r=/[一-龠]+|[ぁ-ん]+|[ァ-ヴー]+|[a-zA-Z0-9]+/
      a = a.gsub(r){|m|  URI.encode_www_form_component(m) }

      u = self._parse a
      if u.query
        q = u.query
        q = q.split(/&/)
        q = q.map{|e|
            n = e
            e = e.split(/=/,2)
            e<<nil unless e.size%2==0
            e
        }
        q= q.flatten
        q = Hash[*q]
        def q.to_str
          self.map{|e|e.join('=')}.join('&')
        end
        u.query = q
      end
      return u
    end
  end
    class Genric
      # alias :_query= :query=
    end
end

class URI::Generic
      alias :_query=  :query=
      def query=(v)
        return @query = v if v.class == Hash
        return self._query=(v)
      end
end

実行するとHashで返してくれる。

=>{ 
  "flow"=>"recipe_ingredient_list",
  "p"=>"1", 
  "ingredient_vals"=>"%u3058%u3083%u304C%u3044%u3082%5B-%5D",
  "ingredient_ids"=>"1_18%5B-%5D"
}

出来ることは出来たが、ruby ってやっぱり面倒くさい。もっとスマートな解決方法はないのかなぁ

2016-08-25 追加

  • GET引数が名前だけ値なしでエラーになるのを解消
  • URI.to_s/to_str で暗黙的変換ができないのを解消
  • 日本語を含むURIに対応できないので、ぱぱっと対応 ( ドメインは未対応 )