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

更新:此外,您的字符串不是有效的 JSON。它需要"{\"name\":\"Marius\"}"代替。

您需要解析该响应,因为现在它是String( "{\"name\"=>\"Marius\"}"),但您实际上需要Hash( {"name" => "Marius"})。

因此失败,#stringify_keys因为它是一种.Hash

所以做一个:

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

反而。这会将您的序列化 JSON 响应转换为Hash来自String.

于 2013-10-05T10:13:35.783 回答