【问题标题】:Ruby rescue and best practice syntaxRuby 救援和最佳实践语法
【发布时间】:2015-12-21 21:06:03
【问题描述】:

我有一些看起来与此类似的代码:

foo = SomeActiveRecordModel.where(bar: 10).first.foo rescue ''

一旦我开始使用 Rubocop,它就在向我大喊救援语法。所以我认为至少有两种其他方法可以编写此代码:

foo = 
begin
  foo = SomeActiveRecordModel.where(bar: 10).first.foo
rescue NoMethodError
  ''
end

还有:

foo = SomeActiveRecordModel.where(bar: 10).first
foo.present? ? foo.foo : ''

这些方式中的哪一种更受欢迎,或者是否有其他更受欢迎的方式?

【问题讨论】:

  • 出于好奇,你在哪里使用这个?我看到所有三个答案结合起来都很出色。但是,如果您在控制器中使用它,也许将 where 方法调用移动到 SomeActiveRecordModel 中的 scopeclass method 可能会更好。
  • 这是在类方法中使用的。它用于从数据库中获取任何存在的规则并将这些规则应用于 sql 查询。

标签: ruby-on-rails ruby syntax rescue


【解决方案1】:

异常处理是为了处理异常的情况。显然,有时可能没有记录。通过捕获NoMethodError 来处理它绝对是错误的做法。一方面,它不仅会捕获“nil:NilClass 上没有方法 foo”,而且会捕获所有其他可能发生的“无方法”错误(在某处打错字等)。

因此,“未找到记录”是一种非例外情况,您必须这样处理,并带有某种条件。

foo = SomeActiveRecordModel.where(bar: 10).first
return '' unless foo
foo.bar

【讨论】:

  • 这很有意义。感谢您抽出宝贵时间就此事对我进行教育。
【解决方案2】:

通常的经验法则是,应为例外情况保留例外情况,即您在正常控制流程中不希望出现的情况。一方面,它们通常比替代品慢。

这是我更喜欢的场景:

foo = SomeActiveRecordModel.find_by_bar(10).try(:foo) || ''

【讨论】:

  • 甚至SomeActiveRecordModel.find_by(bar: 10).try(:foo) || '' 或者SomeActiveRecordModel.find_by(bar: 10).try(:foo).to_s 因为foo 可能是一个字符串。
  • 我以前见过这样的语法,但我什至没有想过要尝试。感谢您的回答以及您花时间描述它。
【解决方案3】:

从现在开始,两者都不是首选方式。首选方式是:

foo = SomeActiveRecordModel.where(bar: 10).first&.foo || ""

【讨论】:

  • 感觉这个新的算子会被滥用的多。 :)
  • 哇,哇,这是什么时候发生的? 为什么
  • @zetetic:ruby 2.3。因为原因。
  • 这很漂亮。只是看着它,如果 foo 不存在,我会期望它会抛出错误,但我想它不存在!感谢您的回答/时间!
猜你喜欢
  • 1970-01-01
  • 2013-08-31
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
相关资源
最近更新 更多