web-dev-qa-db-ja.com

Rails(またはRuby):True / FalseではなくYes / No

関数を簡単に作成してアプリケーションコントローラーに配置できることはわかっていますが、これを実行する機能が他にある場合は、そうしたくありません。基本的に私は次のようなものが欲しいです:

>> boolean_variable?
=> true
>> boolean_variable?.yesno
=> yes
>> boolean_variable?.yesno.capitalize
=> Yes

Railsフレームワークにはすでにこのようなものがありますか?

37
aarona

そのような組み込みヘルパーは存在しませんが、実装するのは簡単です。

class TrueClass
  def yesno
    "Yes"
  end
end

class FalseClass
  def yesno
    "No"
  end
end
37
Jordan Running

Railsには何もありません。

True/falseクラスに追加して同様のことを実現するよりも良い方法は、ApplicationHelperでメソッドを作成することです。

_def human_boolean(boolean)
    boolean ? 'Yes' : 'No'
end
_

次に、あなたの見解で

_<%= human_boolean(boolean_youre_checking) %>
_

組み込みクラスにメソッドを追加することは、一般的に嫌われています。さらに、このアプローチはraw()のようなRailsのヘルパーに密接に適合します。

また、1回限りのオフは、メンテナンス(またはテスト)が容易ではないため、優れたアイデアではありません。

49
Neal

そのための宝石があります: hum​​anize_boolean

その後、あなたはただ行います:

true.humanize # => "Yes" 
false.humanize # => "No"

また、国際化もサポートしているため、en.boolean.yesおよびen.boolean.no(または任意のロケール)の翻訳を含めることで、返される文字列を簡単に変更できます。

23
Mike Heijmans

または、ビューで次のように1回オフにすることもできます。

<%= item.bool_field? ? 'yes' : 'no' %>
15
patrickhawley

_humanize_boolean_ gemはTrueClassFalseClassおよびNilClassを拡張しますが、これは避けたい間接的な拡張です。

トップレベルの翻訳が付いたこのヘルパーは分離されており、変更が容易であり、真実または偽りであれば何でも与えることができます。

_# app/helpers/application_helper.rb
class ApplicationHelper
  def humanize_boolean(boolean)
    I18n.t((!!boolean).to_s)
  end
end

# config/locales/en.yml
en:
  :true: 'Yes'
  :false: 'No'
_

!!(boolean).to_sを実行すると、変換文字列を構築するときに、引数に渡される変数が_"true"_または_"false"_のいずれかの値になります。

使用中で:

_# app/views/chalets/show.html.erb
<%= humanize_boolean(chalet.rentable?) %>
_
15
the-undefined

私は前の回答の一般化された解決策が大好きですが、ビューでブールの人間化されたバージョンを選択的に使用したい場合は、次のようにすることができます:

これをhelpers/application_helper.rbに入れました:

module ApplicationHelper

  def humanize_boolean(value)
    case value
    when true
      "Yes"
    when false
      "No"
    when nil
      "Undefined"
    else
      "Invalid"
    end
  end

end

次に、ビューからこの例のように呼び出すことができます。

Published: <%= humanize_boolean(post.published) %>
0
Ivan Raszl