如果
@users = User.all.group_by(&:iso).map{|k,v| [k, v.count]}
返回
[["GB", 1], ["GI", 3], ["BD", 1]]
为什么我不能这样做
@users = User.all.group_by(&:iso).map{|k,v| [k, v.count, k.downcase]}
获取
[["GB", 1, "gb"], ["GI", 3, "gi"], ["BD", 1, "bd"]]
我收到错误
undefined method `downcase' for nil:NilClass
我如何得到这个。
如果我这样做
@user_json = User.all.group_by(&:iso).map{|k,v| [k, v.count, k.inspect]}
我得到了
[["GB", 1, "\"GB\""], ["GI", 3, "\"GI\""], ["BD", 1, "\"BD\""]
然后
@user_json = User.all.group_by(&:iso).map{|k,v| [k, v.count, k.inspect.downcase]}
[["GB", 1, "\"gb\""], ["GI", 3, "\"gi\""], ["BD", 1, "\"bd\""]
诉混淆
更多细节 - 这项工作(但如果错了,无法解释原因)
我正在尝试使用以下结构构建JSON数组:
[{"code":"GB","value":1,"flag":"gb"},{"code":"GI","value":3,"flag":"gi"},{"code":"BD","value":1,"flag":"bd"}]
我的控制器代码
def global_chart
@user_json = User.all.group_by(&:iso).map{|k,v| [k, v.count, k.to_s.downcase]}.map {|c, v | ["code" => c, "value" => v, "flag" => c.to_s.downcase]}.flatten.to_json
render 'users/charts/global'
end
这有效(@user_json变量具有正确的结构)但是我不能解释上面的行为......
答案 0 :(得分:1)
您的代码
@users = User.all.group_by(&:iso).map{ |k,v| [k, v.count] }
绝对有效,其输出显示我们只有三个iso组。然后
@users = User.all.group_by(&:iso).map{ |k,v| [k, v.count, k.downcase] }
也是绝对有效的代码。但是你得到一个错误undefined method 'downcase' for nil:NilClass
,它告诉我们一个iso值是nil
。第一个示例输出中的情况并非如此。
之后,你的第三个片段
User.all.group_by(&:iso).map{ |k,v| [k, v.count, k.inspect.downcase] }
再次正确,返回与第一个相同的输出(我的意思是相同的iso样本)。
因此代码中的某处是bug。我相信它接近于提供一段代码。您可以显示整个控制器的代码,以查看表面上可能存在的问题。