0
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

底线是它也可以为空或 nil。所以它不能按我的需要工作。它会不断地返回或者返回,false 0但即使它应该返回也true 1永远不会返回。blank or nil我做错什么了?

4

1 回答 1

4

Acase用于===比较,因此相当于:

if false === a
  'false 0'
elsif true === a
  'true 1'
elsif blank? === a
  'blank or nil'
else
  nil
end

Railsblank?向 Object 添加了一个方法,如下所示

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
于 2012-08-05T06:23:58.803 回答