我知道我可以很容易地编写一个函数并将其放在应用程序控制器中,但是如果还有其他东西可以做到这一点,我宁愿不要。基本上我想要有类似的东西:
>> boolean_variable?
=> true
>> boolean_variable?.yesno
=> yes
>> boolean_variable?.yesno.capitalize
=> Yes
Rails框架中是否已存在类似内容?
答案 0 :(得分:43)
Rails中没有东西。
比添加到true / false类以实现类似的更好的方法是在ApplicationHelper中创建一个方法:
def human_boolean(boolean)
boolean ? 'Yes' : 'No'
end
然后,在您的视图中
<%= human_boolean(boolean_youre_checking) %>
通常不赞成向内置类添加方法。此外,这种方法非常适合Rails的助手,如raw()
。
此外,一次性不是一个好主意,因为它们不易维护(或测试)。
答案 1 :(得分:35)
不存在这样的内置帮助器,但实现起来非常简单:
class TrueClass
def yesno
"Yes"
end
end
class FalseClass
def yesno
"No"
end
end
答案 2 :(得分:21)
现在有一个宝石:humanize_boolean
然后你就做了:
true.humanize # => "Yes"
false.humanize # => "No"
它还支持国际化,因此您可以通过包含en.boolean.yes和en.boolean.no(或您喜欢的任何语言环境)的翻译来轻松更改返回的字符串
答案 3 :(得分:15)
或者,您也可以在视图中进行一次性操作,例如:
<%= item.bool_field? ? 'yes' : 'no' %>
答案 4 :(得分:13)
Either
宝石扩展了humanize_boolean
,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"
答案 5 :(得分:0)
我喜欢前面答案中的广义解决方案,但是如果您想在视图中选择性地使用布尔值的人性化版本,则可以执行以下操作:
我将其放入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) %>