2015-08-19 16 views
0

如果紅寶石:在陣列中添加到每個陣列一個新的元件,使得該新元素是downcased版本的現有元件的

@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

爲什麼你不能?你可以 – fl00r

+0

我得到:未定義的方法'downcase'爲零:NilClass – GhostRider

+0

所以你的'iso'之一是空的。試試這個'User.all.group_by(&:iso).map {| k,v | [k,v。count,k.try(:downcase)]}' – fl00r

回答

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。我相信它接近於提供的一段代碼。你可以顯示整個控制器的代碼,看看問題是否存在。

相關問題