Rails 3.2.2, Ruby 1.9.2
我正在使用MySql,并且有TINYINT类型的列“MyColumn”。我需要在页面上显示它的状态。所以我创建了一个辅助方法。
module MyControllerHelper
def result(a)
case a
when false then 'false 0'
when true then 'true 1'
when blank? then 'blank or nil'
end
end
end
底线是它也可以是空的或零。所以它不能按我的需要工作。它会不断返回false 0
或true 1
,但永远不会返回blank or nil
,即使它应该这样做。
我做错了什么?
答案 0 :(得分:4)
case
使用===
进行比较,因此相当于:
if false === a
'false 0'
elsif true === a
'true 1'
elsif blank? === a
'blank or nil'
else
nil
end
Rails向looks like this:
的对象添加blank?
方法
def blank?
respond_to?(:empty?) ? empty? : !self
end
所以你可以在任何地方调用blank?
,即使没有指定的接收者:总会有一个self
,它将永远是一个对象。现在您应该看到when blank?
虽然在语法上有效,但根本没有意义:它不会调用a.blank?
并查看是否返回了真值,它只是检查self.blank? === a
是否有效self
恰好是。
您可能最好使用明确的if/else
:
def result(a)
# false.blank? is true so you don't want a.blank? here.
if(a.nil?)
'nil'
elsif(a)
'true 1'
else
'false 0'
end
end