2016-11-25 106 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