如何优雅地处理 nil 异常?

mar*_*ion 1 error-handling null ruby-on-rails exception ruby-on-rails-4

在我/post/index.html看来,我有这一行:

<%= post.status.upcase %>
Run Code Online (Sandbox Code Playgroud)

每当有一个post具有nil值的状态时,我都会收到此错误:

NoMethodError at /
undefined method `upcase' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

如何安全地处理nil整个应用程序中的所有值,以便它不会抛出这样的错误,它只是优雅地降级甚至忽略它?

我是否必须遍历可能具有可返回 nil 的属性的每个视图和每个对象,并为每个视图和对象添加异常处理?

有没有一种“Rails-y”DRY 方法来处理这个问题?

Jos*_*que 6

我只是想用另一个选项来更新这个线程:Ruby 现在(从 2.3 开始)为我们提供了一个安全的导航操作符,即语法&.

所以:

post.status.upcase

会成为:

post.status&.upcase

与 Rail 的try方法类似,nil如果NoMethodErrornil.


Phi*_*rom 5

恕我直言,忽略 nil 是一个坏主意。这将导致无法追踪的细微错误。但是,如果您的示例想要的是在statusnil 时输出一个空字符串(或根本不输出任何内容),那么您有几个选择。对于我认为你正在做的事情,我更喜欢第一个,其次是第二个,讨厌最后​​两个。

post.status.to_s.upcase

post.status.try(:upcase)

post.status.present? ? post.status.upcase : 'NO STATUS. OH NO'

begin
  post.status.upcase
rescue 
  'NO STATUS. OH NO'
end
Run Code Online (Sandbox Code Playgroud)