Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么Rails(当前的4.0)无法解释嵌套的JSON(来自HTTP POST)?_Ruby On Rails_Ruby_Json_Post_Nested - Fatal编程技术网

Ruby on rails 为什么Rails(当前的4.0)无法解释嵌套的JSON(来自HTTP POST)?

Ruby on rails 为什么Rails(当前的4.0)无法解释嵌套的JSON(来自HTTP POST)?,ruby-on-rails,ruby,json,post,nested,Ruby On Rails,Ruby,Json,Post,Nested,我正在用Ruby(客户端)和Rails(服务器)编写一个简单的客户机-服务器应用程序(仅使用JSONAPI) 尝试从客户端创建游戏时,我使用: 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" =>

我正在用Ruby(客户端)和Rails(服务器)编写一个简单的客户机-服务器应用程序(仅使用JSONAPI)

尝试从客户端创建游戏时,我使用:

    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),我有:

服务器上的日志包括:

    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'

我怎样才能解决这个问题?所有来自互联网的例子看起来都是一样的。谢谢

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

您需要解析该响应,因为现在它是一个
字符串
“{\”name\”=>“Marius\”}
),但实际上您需要一个
散列
{“name”=>“Marius”}

因此,
#stringify_keys
失败,因为它是一种在
散列上运行的方法

a也是这样:

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

相反。这将把序列化的JSON响应从
字符串

转换为
哈希
,您可能需要这样做。它甚至更紧凑

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

从开始,两种方法
set\u form\u data
post\u 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"}}

通过执行您建议的操作,我得到了以下错误:JSON::ParserError(757:在“{”name“=>“Marius”}”处出现意外标记):app/controllers/tttgames_controller.rb:31:“create”中看起来像是JSON.parse无法解释火箭符号(=>),因为它不是JSON的有效标记document@marius_gu是的,我忽略了这个。更新了我的答案,没错!然后问题是:客户端应该如何格式化消息,以便服务器以有效的JSON格式获取消息,如
“{\'name\:\'Marius\'}”
?@Marius\u gu客户端应该只关心发送有效的JSON请求。如果是这样,后端将正确处理它(即解析它)。请在我的例子中给出一个例子,因为在客户端上放置
请求。设置表单数据({“tttgame”=>{“name”=>“Marius”}})
不会作为有效的JSON到达服务器,它具有与
Net::HTTP::Post.set\u表单数据相同的效果
    Parameters: {"tttgame"=>{"name"=>"Marius"}}