我有一个简单的条件检查来查看一个对象(称之为模型)是否与另一个对象有 has_many 关联(称之为关联)。
if model.respond_to? association.pluralize.to_s && !model.send(association.pluralize).nil?
puts "Hello World"
end
每次调用此检查时,rails 都会为模型上的关联抛出一个undefined method
。
在控制台中调试时,我试图找出代码出错的地方。
if model.respond_to? association.pluralize.to_s
puts "Hello World"
end
通过删除条件的后半部分,它不再失败(并且不按预期打印)。还要检查 model.respond_to? association.pluralize.to_s
直接,总是返回false。
所以我又试了一次:
if false && !model.send(association.pluralize).nil?
puts "Hello World"
end
这工作正常,没有任何错误,也没有打印(如我所愿)。
那么为什么在第一组代码中,条件没有短路呢?第一部分总是返回 false,而后半部分仍然被评估导致 NoMethodError
。 respond_to?
或 send
是否存在一些“陷阱”导致了这种情况?或者更简单的东西?任何帮助都会非常感谢!
最佳答案
你有这个错误是因为这个
if model.respond_to? association.pluralize.to_s && !model.send(association.pluralize).nil?
等同于:
if model.respond_to?(association.pluralize.to_s && !model.send(association.pluralize).nil?)
(&&
的优先级高于 respond_to?
方法调用)。
如果您希望它正常工作,请使用括号:
if (model.respond_to? association.pluralize.to_s) && (!model.send(association.pluralize).nil?)
关于ruby-on-rails - 条件&&短路失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24996732/