• 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/161

Railsを使っていると、formにActiveRcordオブジェクトのアトリビュートが勝手に入ってくれたり、フォームの内容が勝手に解析されて、Controllerからparamsで参照できたりと、とても便利です。

Railsのフォームヘルパーが生成したフォーム要素のnameやidを見てみると、"user[name]"のように、ARオブジェクトの属性名がマーシャリングされた状態で織り込まれています。 このようなフォームから送信されたリクエストの結果を解析して、paramsでアクセスできるように変換してくれるのがFormEncodedPairParserです。

今回は、FormEncodedPairParserが解析可能な形式で、ネストしたHashやArrayをQueryStringに変換するFormEncoderモジュールを作ってみました。

module FormEncoder
  def self.encode(parameters, prefix = "")
    case parameters
    when Hash; encode_hash(parameters, prefix)
    when Array; encode_array(parameters, prefix)
    else "#{prefix }=#{CGI.escape(parameters.to_s) }"
    end
  end

private
  def self.encode_hash(hash, prefix)
    hash.inject([]) do |result, (key, value)|
      key = CGI.escape(key.to_s)
      result << encode(value, prefix.empty? ? key : "#{ prefix }[#{ key }]")
    end.join('&')
  end

  def self.encode_array(array, prefix)
    array.inject([]) do |result, value|
      result << encode(value, "#{prefix }[]")
    end.join('&')
  end
end
使用法:
FormEncoder.encode :foo => {:bar => [1, 2], :baz => "Rails"}
#=> "foo[baz]=Rails&foo[bar][]=1&foo[bar][]=2"

CGIMethods.parse_query_parameters(
  "foo[baz]=Rails&foo[bar][]=1&foo[bar][]=2")
#=> {"foo"=>{"baz"=>"Rails", "bar"=>["1", "2"]}}
これを使用することで、formから送信するのと同様な形式でさまざまな情報をQUERY_STRINGに変換できるので、paramsで受け取ることが出来ます。

[English]

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/161

posted by Png genki on Fri 2 Feb 2007 at 07:02
Contents
FormEncodedPairParser互換のQueryStringを生成する
Comments
瀧内元気: MacOS版は以下にあります * [genki/ViMouse](https://githu... '23-1
dsjf: https://gist.github.com/6bf1bf2c3cbb5eb6e7a7 これ... '13-1
瀧内元気: おお、チェックしてみます。thx! '11-12
overisland: Reeder for iPhone もこの UI を実装していますね。 '11-12
瀧内元気: その情報は見たのですが、以下のサイトによると、現在はまた必要になってるっぽいんですよね。 ... '11-12
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ