【发布时间】:2010-10-03 23:27:30
【问题描述】:
我正在使用 Ruby on Rails 并希望验证两种不同的模型:
if (model1.valid? && model2.valid?)
...
end
但是,“&&”运算符使用短路评估(即仅当“model1.valid?”为真时才评估“model2.valid?”),这会阻止在model1 无效时执行model2.valids。
是否存在不使用短路评估的“&&”等价物?我需要评估这两个表达式。
【问题讨论】:
-
出于好奇,为什么需要对两者都进行评估?通常,如果它们没有副作用,短路是可取的。为什么会#valid?有副作用吗?
-
这两个模型与同一个表单相关:最后,它们都必须经过验证才能执行操作。没有副作用,只是因为它是一个表单上的两个模型。
-
嗯...短路是正是你想要的。如果模型1无效,那为什么还要检查模型2?
-
公平地说,一次验证两个模型允许在两个模型上分别向用户报告错误。仅在您修复模型 1 错误后才通知模型 2 中的验证错误,这很烦人。
-
作为参考,#valid?不通知用户错误。它只用错误填充模型错误数组。然后控制器再次显示新的/编辑视图,然后显示错误。
标签: ruby-on-rails operators logical-operators short-circuiting