4

我正在为 Nil 检查我的 Rails 视图寻找一个很好的捷径。我已经看到关于这个的其他问题,但似乎没有一个像我想要的那样简化这个。我想要的是一个简短的语法,""如果特定值为 nil,则返回一个空字符串,否则返回该值。

这里有一个建议,我倾向于尝试。它基本上允许这样的声明:

user.photo._?.url

- 或者 -

user.photo.url._?

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

我的另一个选择是在我的模型上处理 nils,但这似乎太全球化了。

4

5 回答 5

5

您应该检查try在对象上运行提供的方法的方法,如果有问题的对象不为零,则返回该值。否则它只会返回零。

例子

# 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)

有关详细信息,请查看此博客文章

于 2012-08-05T17:47:16.280 回答
3

完成此操作的惯用 Ruby 方法是||运算符,如果左侧表达式是nil(或false),它将返回右侧表达式的值:

puts(user.photo.url || '')

任何经验丰富的 Ruby 程序员都会准确地理解它的作用。如果您编写自定义_?方法,我现在必须查找该方法的用途并记住它的作用,并希望它总是做正确的事情。我通常发现坚持惯用代码比在这里和那里节省一些击键更有益。

于 2012-08-05T17:58:02.000 回答
1

试试这个:

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

如果 user 为 nil 或 user.photo 为 nil,这不会爆炸

于 2012-08-05T18:12:06.890 回答
0

只使用 nil 怎么样?

someObject.nil? # true if someOBj is nil

还是我误解了你想要什么?

于 2012-08-05T17:40:24.027 回答
0

我怀疑您的选项有问题,因为如果 photo 为零,则您的两个语句都应返回“未定义方法”。

你甚至不需要检查'.nil?'。由于您暗示您的检查是在视图中,而不是在控制器中,我想您正在检查一个 @instance 变量,如果未定义,它将始终为零。所以就这样做:

if @someObject
  ...
else
  ...

如果您将条件放在控制器中,那么再次,只需使用 @instance 变量,如果未定义,您将始终至少有 nil。

于 2012-08-05T17:45:59.837 回答