Car*_*lyL 3 ruby syntax ruby-on-rails rescue
我有一些看起来类似于此的代码:
foo = SomeActiveRecordModel.where(bar: 10).first.foo rescue ''
Run Code Online (Sandbox Code Playgroud)
一旦我开始使用Rubocop,就会在那里大吼大叫救援语法.所以我认为至少有两种方法可以编写这些代码:
foo =
begin
foo = SomeActiveRecordModel.where(bar: 10).first.foo
rescue NoMethodError
''
end
Run Code Online (Sandbox Code Playgroud)
和:
foo = SomeActiveRecordModel.where(bar: 10).first
foo.present? ? foo.foo : ''
Run Code Online (Sandbox Code Playgroud)
哪种方式更受欢迎,或者是否有其他首选方式?
异常处理是为了处理异常情况.显然,有时可能没有记录.用捕获NoMethodError来处理它绝对是错误的方法.首先,它不仅会捕获"没有方法foo on nil:NilClass",而是所有其他"无方法"错误,这可能发生(错误在某处等).
因此,"记录未找到"是一种非特殊的情感,你必须按照某种条件处理它.
foo = SomeActiveRecordModel.where(bar: 10).first
return '' unless foo
foo.bar
Run Code Online (Sandbox Code Playgroud)
通常的经验法则是,例外情况应该保留用于特殊情况,即那些在正常控制流程中没有预料到的情况.首先,它们通常比替代品慢.
这是我喜欢的场景:
foo = SomeActiveRecordModel.find_by_bar(10).try(:foo) || ''
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
375 次 |
| 最近记录: |