优雅的方式来处理"未定义的方法`每个'为nil:NilClass"在Ruby中可选的关联?

gk0*_*k0r 3 ruby try-catch associations optional

我有一个场景,我有可选的关联.有时协会在那里,有时则不是.

当我尝试在屏幕上显示数据时遇到问题(想想一个简单的索引操作).

请考虑以下应用程序设置:

  • 项目有很多可交付成果
  • 项目有许多部署记录(此模型的两个属性是'名称'和'描述')

我有兴趣从Deliverables Index Action中提取部署记录关联.

我让它使用以下代码,但我发现它有点难看:

@array = deliverable.try(:project).try(:deployment_record)
if @array
   @array.each do |r|
   [r.name, r.description].join(' - ')
end
Run Code Online (Sandbox Code Playgroud)

什么是更优雅的方式来重写这个?我试过了

deliverable.try(:project).try(:deployment_record).each do |r|
   [r.name, r.description].join(' - ')
end
Run Code Online (Sandbox Code Playgroud)

但我继续遇到未定义的方法`每个'为nil:NilClass错误.我似乎无法找到一种方法来优雅地绕过Nil对象上的.each.我有一种感觉,不知怎的,我应该能够更优雅地做到这一点,但我不能把手指放在上面.

我通过代码库重复使用了这个剪切,所以如果我只是将它复制并粘贴到任何地方,那么额外的两行真的会让我感到害怕.我很高兴关联检索失败,我只是想优雅地失败而没有任何错误或消息.有任何想法吗?

Xav*_*olt 12

您可以使用该to_a方法确保您有一个要使用的数组(nil将产生一个空数组):

@array.to_a.each do |item|
    #Whatever...
end
Run Code Online (Sandbox Code Playgroud)

这不是最优雅的东西 - 你必须记住添加to_a到你的循环 - 但如果你不能保证这@array是一个有效的可枚举,这是保持代码崩溃的最简单方法.