Ruby / Rails忽略块内的nil

时间:2012-02-14 08:40:58

标签: ruby-on-rails ruby null nomethoderror

这只是一个简单的问题。我在这里编写一个功能,创建一个哈希,其中包含开发人员名称作为关键字,以及他为完成的每个功能总计得分的分数。但是我们确实有懒惰的开发人员没有将自己分配给任务,因此我们得到了以nil为键的哈希,我得到NoM​​ethodError:未定义的方法`name'为零:NilClass。什么是一种无视零的清洁方式?这是我的代码

feat_hash = {}
features.group_by {|dev| dev.developer.name}.each {|dev_id, feat| feat_hash[dev_id] = feat.inject(0){|sum, x| sum + x.points}}
提前谢谢! :d

编辑:很酷,所以这是我运行时得到的输出。你会注意到它通过具有已分配功能的sprint和那些为空的sprint进行渲染,但只要它进入带有未分配功能的散列,其中nil作为键就会出错。

         _________features___________
{"Gary"=>13, "Rob"=>8, "Hannes"=>8, "Sandra"=>1}
      ___________bugs_____________
{}
      __________chores____________ 
{}
*************** New Sprint ************************
     _________features___________ 
{}
     ___________bugs_____________
{}
     __________chores____________
{}
*************** New Sprint ************************
     _________features___________
{}
     ___________bugs_____________
{}
     __________chores____________
{}
*************** New Sprint ************************
 NoMethodError: undefined method `name' for nil:NilClass

然后是错误堆栈的其余部分

2 个答案:

答案 0 :(得分:1)

您遇到此错误,因为在dev.developer.name指令中,dev.developernil。您可以在group_by

之前忽略这些开发者
features.reject {|dev| dev.developer.nil?}.group_by {|dev| dev.developer.name}.each { ...

答案 1 :(得分:0)

这是一种使用try来避免此类错误的通用方法。

feat_hash = {}
features.group_by {|dev| dev.developer.name}.try(:each) do |dev_id, feat|        
    feat_hash[dev_id] = feat.inject(0){|sum, x| sum + x.points}
end