为什么第二个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]
感谢阅读。
答案 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
。