Rails(或Ruby):是/否而不是真/假

时间:2010-09-08 02:12:04

标签: ruby-on-rails formatting boolean

我知道我可以很容易地编写一个函数并将其放在应用程序控制器中,但是如果还有其他东西可以做到这一点,我宁愿不要。基本上我想要有类似的东西:

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

Rails框架中是否已存在类似内容?

6 个答案:

答案 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_booleanTrueClassFalseClass,这是我希望避免的间接扩展。

我发现这个顶层翻译的助手是孤立的,友好的改变你可以给它带来任何虚假或虚假的东西:

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) %>