在Rails视图中检查空字符串

4
我正在寻找一种在Rails视图中进行Nil检查的好方法。我看到了SO上的其他问题,但没有一个像我想要的那样简化。我想要的是一个短语法,如果特定值为nil,则返回空字符串"",否则返回该值。
有一个建议在这里,我倾向于尝试一下。它基本上允许像这样的语句:
user.photo._?.url

--或--

user.photo.url._?

这是一个好主意还是充满危险?

我的另一个选择是处理模型上的nil,但那似乎太全局了。

5个回答

5

您应该检查try方法,它在对象上运行提供的方法,并在对象不为nil时返回值。否则,它将返回nil。

示例

# We have a user model with name field
u = User.first

# case 1 : u is not nil
u.try(:name)
=> Foo Bar

# case 2 : u is nil
u.try(:name)
=> nil

# in your case
user.photo.try(:url)

请查看这篇博客文章以获取详细信息。

3
Ruby的惯用方式是使用 || 运算符来实现,如果左侧表达式为 nil (或false),则返回右侧表达式的值:
puts(user.photo.url || '')

任何经验丰富的Ruby程序员都能理解这段代码的作用。如果你写了一个自定义的_?方法,我就必须去查找该方法的目的并记住它的作用,并希望它总是做正确的事情。我通常发现坚持惯用代码比在某些地方节省几个按键更有益。

如果有时用户可能没有照片,请使用try(:url)。 - Ismael
很好的观点。如果语言本身有惯用的方法来实现我想要的功能,那么就不需要这样做了! - jn29098

1

试试这个:

user && user.photo && user.photo.url.present?

如果用户为空或用户照片为空,这不会导致崩溃。


#blank? 作为 #nil?#empty? 的组合使用。#blank? 的反义词是 #present?。它们将简化您的逻辑。 - Dan McClain
糟糕,不小心回滚了丹的编辑。重新回滚到丹的版本。我的错。 - Shailen Tuli
你仍然需要检查URL不是nil或空白。已将其添加到丹的编辑中。 - Shailen Tuli

0

只使用nil怎么样?

someObject.nil? # true if someOBj is nil

还是我误解了你的意思?


这实际上返回 true 或 false,对吧?我想要的是如果 .nil? 那么返回 "",否则返回值。这样说清楚了吗?第一次应该就应该这样问问题,我会更新的。 - jn29098
1
你可能想要使用.try()方法。请参考http://apidock.com/rails/Object/try。同时要注意字符串的评估和空值。"".nil?返回false,但"".empty?返回true。另外," ".nil?返回false," ".empty?也返回false。Rails提供了blank?辅助方法,同时"".blank?和" ".blank?都返回true。 - Shailen Tuli

0

我怀疑你的选项有问题,因为如果照片是nil,那么你的两个语句都应该返回“未定义的方法”。

你甚至不需要检查“.nil?”。由于你暗示你的检查在视图中而不是控制器中,我想象你正在检查一个@实例变量,如果未定义,它将始终为nil。所以只需执行:

if @someObject
  ...
else
  ...

如果你正在在控制器中放置条件,那么只需使用一个 @ 实例变量,如果未定义,你始终会有至少一个 nil 值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接