ruby-on-rails - 条件&&短路失败

标签 ruby-on-rails ruby

我有一个简单的条件检查来查看一个对象(称之为模型)是否与另一个对象有 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,而后半部分仍然被评估导致 NoMethodErrorrespond_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/

相关文章:

ruby-on-rails - rails 未定义方法 `attr_accessible'

ruby-on-rails - rails : send mail after some time has passed

ruby - 类变量和扩展模块

Ruby:为什么 while 和 until 不返回它们从函数执行的最后一行?

ruby-on-rails - Rails Ajax 单行 RJS 文件

ruby-on-rails - Rails 中公共(public)目录中的文件 - Errno::ENOENT (没有这样的文件或目录@ rb_sysopen

ruby-on-rails - 如何将 "exploit"关系数据存入数据库?

用于查找两个日期之间记录的 Ruby 查询在控制台中有效,但在 View 中无效

ruby-on-rails - Rails where not 是找不到 nil 值

mysql - Rails Active Record 查询 - 分类,根据 'updated_at' 值排序