【问题标题】:Rails (or Ruby): Yes/No instead of True/FalseRails(或 Ruby):Yes/No 而不是 True/False
【发布时间】:2011-04-09 12:22:11
【问题描述】:

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

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

Rails 框架中是否已经存在类似的东西?

【问题讨论】:

标签: ruby-on-rails formatting boolean


【解决方案1】:

不存在这样的内置帮助器,但它很容易实现:

class TrueClass
  def yesno
    "Yes"
  end
end

class FalseClass
  def yesno
    "No"
  end
end

【讨论】:

  • 嘿,这比我想出的要漂亮。就 Rails 应用程序而言,放置此代码的最佳位置在哪里?在 lib 下的文件中还是什么?
  • 我会在名为“boolean_path.rb”的配置/初始化程序路径中创建一个自定义初始化程序。这样,这些新方法将可以通过应用程序使用。干杯!
  • @Eytan 我是 ruby​​ 和 rails 的新手,我正在努力遵守约定,但我不知道如何创建初始化程序,你能帮我吗?基本上我会在那个 boolean_path.rb 中放什么,我该如何使用它?我想做的是在创建模型时,我想使用 t.boolean_yesno 而不是常规布尔值,并输出是或否而不是 True 或 False。如果您愿意,我会为此提出另一个问题,请告诉我。
  • 让我们在这里回答您的问题,因为它非常适合这个问题。要创建初始化程序,您需要做的就是在 config/initializers 文件夹中添加一个 .rb 文件,然后将上面的代码复制并粘贴到其中。现在,每当您使用布尔变量时,您都可以调用:my_boolean_variable.yesno,它将返回“是”或“否”。
  • @CorySimmons 这不太可能,除非您选择与其他名称冲突的方法名称。 yesno 可能是安全的。
【解决方案2】:

或者,你也可以在你的视图中做一个关闭,例如:

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

【讨论】:

  • 与其他解决方案相比,这不是很干燥,并且难以本地化。
  • 不,杰夫,你完全正确。我说的是one offs,而不是many offs,在后者的情况下,助手当然是更明智(和干燥)的选择,因为你指出来。
  • 完美!我有一个单一形式的应用程序,所以我不关心本地化/干燥(还)。谢谢你。
【解决方案3】:

Rails 中没有任何东西。

比添加真/假类来实现类似的更好的方法是在 ApplicationHelper 中创建一个方法:

def human_boolean(boolean)
    boolean ? 'Yes' : 'No'
end

那么,在你看来

<%= human_boolean(boolean_youre_checking) %>

向内置类添加方法通常是不受欢迎的。此外,这种方法非常适合 Rails 的助手,例如 raw()。

此外,一次性也不是一个好主意,因为它们不容易维护(或测试)。

【讨论】:

    【解决方案4】:

    现在有一个宝石:humanize_boolean

    然后你就这样做:

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

    它还支持国际化,因此您可以通过包含 en.boolean.yes 和 en.boolean.no(或您喜欢的任何语言环境)的翻译来轻松更改返回的字符串

    【讨论】:

    • 宝石看起来有点令人震惊,不是吗?
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      我喜欢前面答案中的通用解决方案,但如果您想在视图中选择性地使用布尔值的人性化版本,您可以执行以下操作:

      我把它放到 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) %>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-08
        • 2013-09-09
        • 1970-01-01
        • 2010-10-11
        • 2018-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多