Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby rescue和最佳实践语法_Ruby On Rails_Ruby_Syntax_Rescue - Fatal编程技术网

Ruby on rails Ruby rescue和最佳实践语法

Ruby on rails Ruby rescue和最佳实践语法,ruby-on-rails,ruby,syntax,rescue,Ruby On Rails,Ruby,Syntax,Rescue,我有一些代码与此类似: 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 rescue ''
一旦我开始使用Rubocop,它就对我大喊大叫,要求在那里使用救援语法。所以我想至少还有两种方法可以编写这段代码,它们是:

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


以下哪种方式更可取,或者有其他方式更可取

从现在起,这两种方式都不是首选方式。首选的方式是:

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

通常的经验法则是,应该为异常情况保留异常,这些情况是您在正常控制流中不期望的。一方面,它们通常比替代品慢

以下是我对您的场景的偏好:

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

异常处理用于处理异常情况。显然,有时可能没有记录。用catch
NoMethodError
处理它绝对是错误的。一方面,它不仅会捕获“nil:NilClass上的no-methodfoo”,还会捕获所有其他可能发生的“no-method”错误(在某处输入错误等)

所以,“RecordNotFound”是一个非异常情况,您必须使用某种条件来处理它

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

我觉得这个新接线员会被滥用。:)哇,哇,这是什么时候发生的?为什么?@zettetic:。因为原因。这很漂亮。只要看看它,如果foo不存在的话,我本以为它会抛出一个错误,但我猜它不存在!谢谢你的回答/时间!甚至是
SomeActiveRecordModel.find_by(bar:10)。try(:foo)|“
或者
SomeActiveRecordModel.find_by(bar:10)。try(:foo)。to_s
as
foo
可能是一个字符串。我以前见过类似的语法,但我甚至没有想过尝试。谢谢你的回答和你花的时间来描述它。出于好奇,你在哪里使用这个?我认为这三个答案加起来都很出色。但是如果您在控制器中使用它,可能会将
where
方法调用移动到
scope
SomeActiveRecordModel
中的
class方法,这可能会更好。这是在class方法中使用的。它被用来从数据库中获取任何存在的规则,并将这些规则应用到sql查询中。这很有意义。谢谢你花时间来教育我这件事。
foo = SomeActiveRecordModel.where(bar: 10).first
return '' unless foo
foo.bar