2016-11-25 83 views
-1

我正在返回JSON中用户字段的响应。我正在创建JSON,如下所示。Ruby hash返回奇怪的值

def user_response(users) 
    users_array = [] 
    users.each do |user| 
     uhash = {} 
     uhash[:id] = user.id, 
     uhash[:nickname] = user.nickname, 
     uhash[:online_sharing] = user.online_sharing, 
     uhash[:offline_export] = user.offline_export, 
     uhash[:created_at] = user.created_at, 
     uhash[:app_opens_count] = user.app_opens_count, 
     uhash[:last_activity] = user.last_activity, 
     uhash[:activity_goal] = user.activity_goal, 
     uhash[:last_activity] = user.last_activity, 
     uhash[:region] = user.region 
     users_array << uhash 
    end 
    users_array 
    end 

但是,这个回答很奇怪。散列中的:id键具有所有字段的数组不知道为什么。

{ 
    "nickname": "adidas", 
    "online_sharing": null, 
    "offline_export": null, 
    "created_at": "2016-08-26T09:03:54.000Z", 
    "app_opens_count": 29, 
    "last_activity": "2016-08-26T09:13:01.000Z", 
    "activity_goal": 3, 
    "region": "US", 
    "id": [ 
     9635, 
     "adidas", 
     null, 
     null, 
     "2016-08-26T09:03:54.000Z", 
     29, 
     "2016-08-26T09:13:01.000Z", 
     3, 
     "2016-08-26T09:13:01.000Z", 
     "US" 
    ] 
    } 
+0

错误在下面提到,但它不是正确的方法来写这个方法 –

+0

问题在下面解释,但如果它不清楚为什么'uhash [:id]'的值是一个数组,如果'uhash = {}; uhash [:id] = 1,2,3; uhash#=> {:id => [1,2,3]}'。在不同的行上分配'1,','2,和'3是没有区别的。 –

回答

2

月底到您的,是因为你有逗号,在每行

uhash[:id] = user.id, 

而且结束,你可以改变上述代码为:

def user_response(users) 
    users.map do |user| 
    user.attributes.slice(:id, :nickname, :online_sharing, :offline_export, :created_at, :app_opens_count, :last_activity, :activity_goal, :last_activity, :region) 
    end 
end 
3

的问题包括两个方面:

  1. 赋值评估为被分配的值:

    puts (foo = 42) # => prints 42 
    
  2. 多个值,用逗号在赋值形式的的右手侧分离阵列:

    bar = 1, 2, 3 
    bar # => [1, 2, 3] 
    

新线s不会改变,所以你基本上做这样的事情:

sonne = (foo = :eins), (bar = :zwei), (baz = :drei), (qux = :vier) 
sonne # => [:eins, :zwei, :drei, :vier] 

该修复确实是删除逗号。

+0

这里的用户倾向于喜欢他们问题的即时解决方案,而不是通过一个体面的解释来理解问题。这个问题就是这个现象的一个很好的例子。非常好的答案! +1 –

+0

@AndreyDeineko,公平地说,也许它不是那种黑白的。 Fallenhero的答案得到了最多的赞扬,因为它是第一个,而且正确性可以被任何理解问题的人立即证实。我的回答需要更多的时间阅读,因此不太可能被验证和upvoted。 Deepak的回答可能被接受,可能是因为OP学到了一些新东西并得到了一个优雅的实现(与我刚刚教你的答案相反)。 – ndn

+0

对这个问题的理想答案应该是带有一个** tl; dr **标题(Fallenhero的答案)* -hr- *实际解释(我的答案)* -hr- *对问题更加习惯的解决方案(Deepak's回答)。 – ndn