0

Ruby (クライアント) と Rails (サーバー) を使用して、単純なクライアント サーバー アプリケーション (JSON API のみを使用) を作成しています。

クライアントからゲームを作成しようとするとき、私は以下を使用しています:

    uri = URI.parse(url)
    http = Net::HTTP.new(uri.host, uri.port)

    request = Net::HTTP::Post.new(uri.request_uri)
    request.set_form_data({"tttgame" => {"name" => "Marius"}})

    resp = http.request(request)

サーバー側 (tttgames_controller.rb) には次のものがあります。

    # POST /tttgames
    # POST /tttgames.json
    def create
      @tttgame = Tttgame.new(tttgame_params)
      ...
    end
    ...
    def tttgame_params
      params.require(:tttgame).permit(:name)
    end

サーバー上のログは次のとおりです。

    Started POST "/tttgames.json" for 127.0.0.1 at 2013-10-05 12:58:44 +0300
    Processing by TttgamesController#create as JSON
      Parameters: {"tttgame"=>"{\"name\"=>\"Marius\"}"}
    Completed 500 Internal Server Error in 0ms

    NoMethodError (undefined method `stringify_keys' for "{\"name\"=>\"Marius\"}":String):
      app/controllers/tttgames_controller.rb:33:in `create'

どうすればこれを修正できますか? インターネットからのすべての例は同じように見えます。ありがとう!

4

3 に答える 3

2

どちらの方法もset_form_datapost_formフォーマット x-www-form-urlencoded を使用してデータをエンコードしています。ここで確認してください。提供されている例には、ネストされたハッシュは含まれていません。

ここで、REST メソッド セクションの下に、非常にうまく機能する例を見つけました。

したがって、ネストされたハッシュを持つ有効な構造をサーバーで取得するには、クライアントは角括弧を使用する必要があります。

    uri = URI.parse(url)
    http = Net::HTTP.new(uri.host, uri.port)
    request = Net::HTTP::Post.new(uri.request_uri)
    request.set_form_data({"tttgame[name]" => “Marius”)
    resp = http.request(request)

またははるかに簡単です:

    uri = URI.parse(url)
    resp = Net::HTTP.post_form(uri, {"tttgame[name]" => “Marius”})

これはサーバー上で生成されます

    Parameters: {"tttgame"=>{"name"=>"Marius"}}
于 2013-10-09T12:24:19.180 に答える
0

代わりにこれを行うことができます。さらにコンパクトです。

uri = URI.parse(url)
resp = Net::HTTP.post_form(uri, "tttgame" => {"name" => "Marius"})

http://ruby-doc.org/stdlib-2.0.0/libdoc/net/http/rdoc/Net/HTTP.html#label-POST+with+Multiple+Valuesから

于 2013-10-05T14:24:15.290 に答える
-2

UPDATE : さらに、文字列は有効な JSON ではありません。代わりにする必要があり"{\"name\":\"Marius\"}"ます。

現在は ( ) ですが、実際には ( ) が必要なので、その応答を解析する必要がありStringます。"{\"name\"=>\"Marius\"}"Hash{"name" => "Marius"}

で動作するメソッドであるため、したがって#stringify_keys失敗します。Hash

次のようにします。

@tttgame = Tttgame.new(JSON.parse(tttgame_params))

代わりは。Hashこれにより、シリアル化された JSON 応答がからに変わりますString

于 2013-10-05T10:13:35.783 に答える