1

ハッシュの値とキーを文字列に変換して、のパラメータとして正しく準備する必要がありますNet::HTTP.post_form。例えば:

変換する必要があります

{:x => [1,2,3,4]}

{"x"=>"[1, 2, 3, 4]"}

記号を文字列に変換し、配列を引用符で囲むことが重要です。

  • to_json文字列を返しますが、問題は解決しません。リターンとしてハッシュが必要です。
  • to_sハッシュにはより多くのキーと値が含まれている可能性があるため、各キーまたは値にハードコーディングすることはできません。

どうすれば実行できますか?

4

2 に答える 2

11

これはどうですか

Hash[ { :x => [1,2,3,4] }.map { |k, v| [k.to_s, v.to_s] } ]
#=> {"x"=>"[1, 2, 3, 4]"}

またはRuby>=2.1

{ :x => [1,2,3,4] }.map { |k, v| [k.to_s, v.to_s] }.to_h
#=> {"x"=>"[1, 2, 3, 4]"}

またはRuby>=2.6

{ :x => [1,2,3,4] }.to_h { |k, v| [k.to_s, v.to_s] }
#=> {"x"=>"[1, 2, 3, 4]"}
于 2013-03-02T01:27:04.007 に答える
4

確立されたホイールを再発明しないでください。代わりに、RubyのURIは使用するのに適したツールです。

require 'uri'

uri = URI.parse('http://www.example.com')
uri.query = URI.encode_www_form( {:x => [1,2,3,4]} )
uri.to_s # => "http://www.example.com?x=1&x=2&x=3&x=4"

クエリ値のみが必要な場合:

query = URI.encode_www_form( {:x => [1,2,3,4]} ) # => "x=1&x=2&x=3&x=4"

Net :: HTTPを介して送信する場合は、ホイールを再発明しているように思えます。にハッシュをシリアル化する{"x"=>"[1, 2, 3, 4]"}と、コードはコードのみで機能するように制限されます。JSON、YAML、またはXMLを使用すると、作業が楽になり、コードの移植性が高まります。

JSONを使用すると、Ruby / Python / Java / Perlなどの言語間で、ブラウザーからサーバーへ、またはクライアントからサーバーへ、マシン間でハッシュを簡単に移動できます。

require 'json'
hash = {:x => [1,2,3,4]}

hash.to_json
=> "{\"x\":[1,2,3,4]}"

JSON[hash.to_json]
=> {
    "x" => [
        [0] 1,
        [1] 2,
        [2] 3,
        [3] 4
    ]
}

これは、ハッシュからJSONの表現、そしてハッシュへのラウンドトリップです。中間文字列"{\"x\":[1,2,3,4]}"は、Net::HTTPを介して簡単に送信されます。

于 2013-03-02T05:13:25.513 に答える