我正在为 Nil 检查我的 Rails 视图寻找一个很好的捷径。我已经看到关于这个的其他问题,但似乎没有一个像我想要的那样简化这个。我想要的是一个简短的语法,""
如果特定值为 nil,则返回一个空字符串,否则返回该值。
这里有一个建议,我倾向于尝试。它基本上允许这样的声明:
user.photo._?.url
- 或者 -
user.photo.url._?
这是个好主意还是充满危险?
我的另一个选择是在我的模型上处理 nils,但这似乎太全球化了。
我正在为 Nil 检查我的 Rails 视图寻找一个很好的捷径。我已经看到关于这个的其他问题,但似乎没有一个像我想要的那样简化这个。我想要的是一个简短的语法,""
如果特定值为 nil,则返回一个空字符串,否则返回该值。
这里有一个建议,我倾向于尝试。它基本上允许这样的声明:
user.photo._?.url
- 或者 -
user.photo.url._?
这是个好主意还是充满危险?
我的另一个选择是在我的模型上处理 nils,但这似乎太全球化了。
您应该检查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)
有关详细信息,请查看此博客文章。
完成此操作的惯用 Ruby 方法是||
运算符,如果左侧表达式是nil
(或false
),它将返回右侧表达式的值:
puts(user.photo.url || '')
任何经验丰富的 Ruby 程序员都会准确地理解它的作用。如果您编写自定义_?
方法,我现在必须查找该方法的用途并记住它的作用,并希望它总是做正确的事情。我通常发现坚持惯用代码比在这里和那里节省一些击键更有益。
试试这个:
user && user.photo && user.photo.url.present?
如果 user 为 nil 或 user.photo 为 nil,这不会爆炸
只使用 nil 怎么样?
someObject.nil? # true if someOBj is nil
还是我误解了你想要什么?
我怀疑您的选项有问题,因为如果 photo 为零,则您的两个语句都应返回“未定义方法”。
你甚至不需要检查'.nil?'。由于您暗示您的检查是在视图中,而不是在控制器中,我想您正在检查一个 @instance 变量,如果未定义,它将始终为零。所以就这样做:
if @someObject
...
else
...
如果您将条件放在控制器中,那么再次,只需使用 @instance 变量,如果未定义,您将始终至少有 nil。