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_STRI
NGに変換できるので、paramsで受け取ることが出来ます。
[English]
This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/161