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

aar*_*ona 37 formatting boolean ruby-on-rails

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

>> boolean_variable?
=> true
>> boolean_variable?.yesno
=> yes
>> boolean_variable?.yesno.capitalize
=> Yes
Run Code Online (Sandbox Code Playgroud)

Rails框架中是否有这样的东西?

Nea*_*eal 47

Rails中没有东西.

比添加到true/false类以实现类似的更好的方法是在ApplicationHelper中创建一个方法:

def human_boolean(boolean)
    boolean ? 'Yes' : 'No'
end
Run Code Online (Sandbox Code Playgroud)

然后,在你看来

<%= human_boolean(boolean_youre_checking) %>
Run Code Online (Sandbox Code Playgroud)

通常不赞成向内置类添加方法.另外,这种方法非常适合Rails的助手raw().

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


Jor*_*ing 36

没有这样的内置帮助程序,但它实现起来非常简单:

class TrueClass
  def yesno
    "Yes"
  end
end

class FalseClass
  def yesno
    "No"
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 让我们回答你的问题,因为它很适合这个问题.要创建初始化程序,您只需在config/initializers文件夹中添加.rb文件,然后将上述代码复制并粘贴到其中.现在,无论何时使用布尔变量,都可以调用:my_boolean_variable.yesno,它将返回"是"或"否". (2认同)

小智 23

现在有一个宝石:humanize_boolean

那你就做:

true.humanize # => "Yes" 
false.humanize # => "No"
Run Code Online (Sandbox Code Playgroud)

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

  • 宝石对此似乎有点过分,不是吗? (3认同)

pat*_*ley 15

或者,您也可以在视图中进行一次性操作,例如:

<%= item.bool_field? ? 'yes' : 'no' %>
Run Code Online (Sandbox Code Playgroud)

  • 不,杰夫,你说得对.我指的是*一个*offs,而不是*很多*offs,而在后者的情况下,帮助器当然是更明智的(和DRY)选项,正如你所指出的那样. (5认同)
  • 与其他解决方案相比,这不是很干,而且很难本地化。 (2认同)

the*_*ned 15

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'
Run Code Online (Sandbox Code Playgroud)

这样做!!(boolean).to_s可以确保传递给参数变量可以是一个"true""false"建立翻译字符串时值.

正在使用:

# app/views/chalets/show.html.erb
<%= humanize_boolean(chalet.rentable?) %>
Run Code Online (Sandbox Code Playgroud)