RoR:为什么这个if语句失败了?

时间:2010-07-17 04:31:40

标签: ruby-on-rails ruby if-statement

为什么第二个if语句在以下代码块中失败?控制台的输出表明private参数为0,所以它应该通过?私有参数来自新表单中的复选框,我用它来设置模型中的布尔字段。

if (((params[:note])[:text]) != "")
  logger.debug("passed first test")
  logger.debug(((params[:note])[:private]))
  if (((params[:note])[:private]) == 0)
    logger.debug("passed second test")
  end
end

控制台输出

passed first test
0
Completed in 61ms (DB: 1) | 302 Found [http://localhost/notes]

感谢阅读。

2 个答案:

答案 0 :(得分:4)

表单字段以字符串形式提交,因此params[:notes][:private]实际上包含"0"而不是0

您可以使用params[:notes][:private] == "0"params[:notes][:private].to_i == 0进行比较。

如果要将非整数值(包括空字符串和缺失值)与0区别对待,则不应使用String#to_i。我建议在这些情况下检查字符串值。

您可以在调试时使用Object#inspect(如@ sepp2k所述)和Object#class以更好地了解事物的类型。使用script/console时,我发现ap(或pp)非常方便。


旁注:在Ruby中,您不需要这么多括号。以下是经过一些清理后的例子:

unless params[:note][:text].blank?
  logger.debug "passed first test"
  logger.debug params[:note][:private].inspect
  if params[:note][:private].to_i == 0
    logger.debug "passed second test"
  end
end

答案 1 :(得分:1)

如果两个表达式打印相同但不相等,则通常有不同的类型。例如"0":"0"0都打印为0,但实际上并不相等。

logger.debug(params[:note][:private].inspect)应该为您提供更有意义的输出,指示对象的类型以及内容(即,如果它是一个字符串,它被引号括起来,如果它是一个以冒号开头的符号,等等)

params中的值通常是字符串,因此params[:note][:private]的值很可能是"0",而不是0