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

Rails はblank?Object に次のようなメソッドを追加します:

def blank?
  respond_to?(:empty?) ? empty? : !self
end

blank?そのため、指定されたレシーバーがなくても、どこでも呼び出すことができます。常に aselfがあり、常に Object になります。は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 に答える