関数を簡単に作成してアプリケーションコントローラーに配置できることはわかっていますが、これを実行する機能が他にある場合は、そうしたくありません。基本的に私は次のようなものが欲しいです:
>> boolean_variable?
=> true
>> boolean_variable?.yesno
=> yes
>> boolean_variable?.yesno.capitalize
=> Yes
Railsフレームワークにはすでにこのようなものがありますか?
そのような組み込みヘルパーは存在しませんが、実装するのは簡単です。
class TrueClass
def yesno
"Yes"
end
end
class FalseClass
def yesno
"No"
end
end
Railsには何もありません。
True/falseクラスに追加して同様のことを実現するよりも良い方法は、ApplicationHelperでメソッドを作成することです。
_def human_boolean(boolean)
boolean ? 'Yes' : 'No'
end
_
次に、あなたの見解で
_<%= human_boolean(boolean_youre_checking) %>
_
組み込みクラスにメソッドを追加することは、一般的に嫌われています。さらに、このアプローチはraw()
のようなRailsのヘルパーに密接に適合します。
また、1回限りのオフは、メンテナンス(またはテスト)が容易ではないため、優れたアイデアではありません。
そのための宝石があります: humanize_boolean
その後、あなたはただ行います:
true.humanize # => "Yes"
false.humanize # => "No"
また、国際化もサポートしているため、en.boolean.yesおよびen.boolean.no(または任意のロケール)の翻訳を含めることで、返される文字列を簡単に変更できます。
または、ビューで次のように1回オフにすることもできます。
<%= item.bool_field? ? 'yes' : 'no' %>
_humanize_boolean
_ gemはTrueClass
、FalseClass
および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?) %>
_
私は前の回答の一般化された解決策が大好きですが、ビューでブールの人間化されたバージョンを選択的に使用したい場合は、次のようにすることができます:
これを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) %>