当前位置: 首页 > 知识库问答 >
问题:

在Ruby中为可选关联处理“未定义的方法‘each’for nil:NilClass”的优雅方式?

司马钱明
2023-03-14

我有一个场景,其中有可选的关联。有时会有联系,但有时不会。

当我试图在屏幕上显示html" target="_blank">数据时,我遇到了一个问题(想想一个简单的索引操作)。

考虑以下应用程序设置:

  • 项目有许多可交付成果

我有兴趣从可交付成果索引操作中提取部署记录关联。

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

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

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

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

但我一直在为nil:NilClass错误运行未定义的方法“each”。我似乎找不到一个优雅的方式绕过这个。每个都在Nil对象上被调用。我有一种感觉,不知何故,我应该能够做得更优雅,但我不能把我的手指放在它。

我在代码库中多次重复使用这个代码,因此如果我只是将其复制并粘贴到任何地方,那么额外的两行代码都会让我非常痛苦。我很高兴关联检索失败,我只想优雅地失败,没有任何错误或消息。有什么想法吗?

共有2个答案

公冶光亮
2023-03-14

在可交付成果中,通过::project有许多:deployment\u记录,然后当您请求deployment\u记录时,它们将作为空集合返回。

师腾
2023-03-14

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

@array.to_a.each do |item|
    #Whatever...
end

这不是最优雅的事情-你必须记住将添加到循环中-但是如果你不能保证@array是有效的可枚举项,这是防止代码崩溃的最简单方法。

 类似资料:
  • 本文向大家介绍Nodejs异步回调的优雅处理方法,包括了Nodejs异步回调的优雅处理方法的使用技巧和注意事项,需要的朋友参考一下 前言 Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用。在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O的操作结果基本上都需要在回调函数中处理,比如下面的这个读取文件内容的

  • 我目前正在开发JavaFX中的计算器,现在正在尝试实现键盘输入支持。 为此,我试图在主. java文件中实现一个EventHandler,如下所示: FXMLDocumentController。java: 现在的问题是,每当按下这些键时,都会发生与我在GUI中单击相应按钮时相同的事情。 所有数字按钮共享一个onAction事件, ,-,/,* 也共享一个,等等。它们都使用FXMLDocument

  • 大家好,我刚刚遇到了这个问题,我正在学习教程,我试图在我的文章和类别之间创建多对多关联,所以我通过键入以下内容添加了article\u类别模型: 在这个模型里面我输入了 内部文章。rb: 和内部类别。rb: 所以我去了控制台:通过输入以下内容进行关联: 我检查了文章。类别 我也试了分类 结果是: 所以我试图通过输入以下内容使这篇文章成为此类文章的一部分: 所以我得到了这个错误: 这是错误,伙计们,

  • 我知道有很多类似的问题,但这些解决方案都不管用。我有一个关系数据库。具体来说,我有两个相互关联的表格:程序和讲师。 表之间的关系如下: 一个程序“has_many:讲师”和一个讲师“belongs_to:程序” 以下是表格模型的代码: 我还有一个非常简单的观点: 控制器为: 问题是RoR没有识别表之间的关系,导致行"@an.instructors.empty?失败,并出现以下错误:nil的未定义方

  • 超过3个小时,我试图解决相当容易的错误(第一眼): 但还是没有成功。 我有DB表products,其中包含列category\u id和manufacturer\u id。 协会: 试图获取一些数据: 我获取了所有行,其中在列

  • 我正在学习Ruby,我有一个无法理解的bug。我有一个方法,它接受一个字符串(行)数组,并删除所有行,直到包含模式的某一行。该方法如下所示: 这工作正常,生成的字符串(行)正确显示在我正在生成的网页上。 此外,我想删除该模式后面的所有非空行。我修改了方法如下: 令人惊讶的是(至少对我来说)这不起作用。在生成的网页上,我看到的不是内容,而是错误消息:Liquid error:nil类的未定义方法“[