2011-09-08 59 views
0

嘿家伙,所以我想构建一些基于表单提交的JSON。我的JSON需要是这样(截断为简单起见):Ruby/Rails嵌套哈希myhash [“key1”] [“childkey”] - NoMethodError

{"id":0,"creditCard":{"address":{"state":"AZ"}}} 

基本上我试图做这样的:

json_hash = Hash.new 
json_hash["id"] = 0 
json_hash["creditCard"]["address"]["state"] = "test" 
json_hash.to_json 

但其引发此errror:

You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.[] 

在给出的例子中的第三行(深度嵌套的东西)。红宝石哈希像这样工作吗?或者我需要采取额外的步骤?

回答

2

因为在第三行中您正在评估json_hash['creditCard']这是nil,那么它没有方法[]

可以使用

json_hash = { "id" => 0,"creditCard" => { "address" => {"state" => "AZ"}}} 

建立这样一个散列,它具有给定的格式。

那是一个简短的语法,以指定的事实,你在json_hash想什么它是不是一个哈希值。它是一种具有在其"id"键的值0的散列,然后在其"creditCard"它存储另一个散列含有在其"address"键另一个散列(即{"state" => "AZ"})。

看这个撬成绩单:

pry(main)> json_hash = { "id" => 0,"creditCard" => { "address" => {"state" => "AZ"}}} 
=> {"id"=>0, "creditCard"=>{"address"=>{"state"=>"AZ"}}} 
pry(main)> json_hash.object_id 
=> 2175368520 
pry(main)> json_hash['creditCard'].object_id 
=> 2175368560 
pry(main)> json_hash['creditCard']['address'].object_id 
=> 2175368600 

所有这些值有不同object_id所以它们不是一回事一样的东西,无论是性能。