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