我有一个简单的条件检查,看一个对象(称之为模型)是否与另一个对象有一个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
?还是更简单的东西?任何帮助都会非常感谢!
答案 0 :(得分:10)
您有此错误,因为
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?)
答案 1 :(得分:1)
这是条件陈述中的歧义,请尝试:
if model.respond_to?(association.pluralize.to_s) && !model.send(association.pluralize).nil?
puts "Hello World"
end