Rails 3 - IF语句在NIL上没有中断

时间:2010-09-19 00:27:08

标签: ruby-on-rails ruby-on-rails-3

我有以下if语句:

if !projectid_viewing.nil? && !user.role(projectid_viewing).nil? && user.role(projectid_viewing) == 'admin'

我正在尝试使用上面的内容,不是if break是projectid_viewing或user.role是nil。 projectid_viewing似乎工作得很好,但user.role不断破坏,给出以下错误:

undefined method `role' for nil:NilClass

你能帮助我使用if语句吗?是否有更优雅的方式来编写语句?

1 个答案:

答案 0 :(得分:5)

你需要确保用户也不是零。

请注意,在Ruby中,条件语句中的值为nil将被解释为false。因此,如果在条件语句中使用带有nil值的变量,它也将计算为false。知道了这一点,您可以将!projectid_viewing.nil?等语句简化为变量的名称,并且它的工作方式也相同。

if projectid_viewing && user && user.role(projectid_viewing) == 'admin'

以上只是简单的Ruby,但是你说你正在使用Rails 3.Rails有一个简洁的方法:Object#try。它允许您将此语句进一步简化为以下内容:

if projectid_viewing && user.try(:role, projectid_viewing) == 'admin'

如果user的值为nil,则Object#try方法将保护您,并且表达式的整个第二部分将返回nil(即false)。