Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 对于Rails中的某些情况,如何实现Yes/No而不是Boolean?_Ruby On Rails_Ruby_Boolean - Fatal编程技术网

Ruby on rails 对于Rails中的某些情况,如何实现Yes/No而不是Boolean?

Ruby on rails 对于Rails中的某些情况,如何实现Yes/No而不是Boolean?,ruby-on-rails,ruby,boolean,Ruby On Rails,Ruby,Boolean,我是编程新手,但在我的应用程序中,我希望某些情况下显示“是”或“否”,而不是“真”或“假”。我不确定最好的方法是什么,我读了这个问题,但不知道如何实现它。有人能帮我吗,最好把它放在初始化者、助手或其他地方?我希望能够在我希望显示是/否的任何位置调用视图中的某些内容,或者创建一个自定义数据类型,在我的混合中,我可以创建类似于t.boolean_yesno的内容,然后我对每个列执行该操作,它只会将true存储为Yes,将false存储为No 如果能帮我走上正轨,我将不胜感激,因为我没有与初始化者或助

我是编程新手,但在我的应用程序中,我希望某些情况下显示“是”或“否”,而不是“真”或“假”。我不确定最好的方法是什么,我读了这个问题,但不知道如何实现它。有人能帮我吗,最好把它放在初始化者、助手或其他地方?我希望能够在我希望显示是/否的任何位置调用视图中的某些内容,或者创建一个自定义数据类型,在我的混合中,我可以创建类似于t.boolean_yesno的内容,然后我对每个列执行该操作,它只会将true存储为Yes,将false存储为No

如果能帮我走上正轨,我将不胜感激,因为我没有与初始化者或助手打交道的经验。谢谢

地区 我建议使用Rails区域设置。这些允许您为任何变量定义语言文本。例如,你的应用程序可以对说英语的人说“是”/“否”,对说法语的人说“Oui”/“否”

区域设置也很快、灵活、易于更改,因为它们独立于典型的源代码。您可以看到区域设置如何在源代码逻辑和呈现的文本之间实现非常好的分离

例如:

#./config/locales/en.yml
en:
  TrueClass: "Yes"
  FalseClass: "No"

#./app/views/items/index.html.erb
The value is <%= translate(myboolean.class) %>
The translate method can be abbreviated like this <%= t myboolean.class %>
。/config/locales/en.yml
嗯:
TrueClass:“是的”
假课堂:“不”
#./app/views/items/index.html.erb
价值是
translate方法可以这样缩写
助手 您可能会看到其他人使用帮助器编写如下代码:

#./app/helpers/application.rb
def yesno(x)
  x ? "Yes" : "No"
end

# ./app/views/items/index.html.erb
<%= yesno(myboolean) %>
。/app/helpers/application.rb
def yesno(x)
x?“是”:“否”
结束
#./app/views/items/index.html.erb
或者像这样使用常量:

#./app/helpers/application.rb
YESNO = {true: "Yes", false: "No"}

# ./app/views/items/index.html.erb
<%= YESNO[myboolean] %>
。/app/helpers/application.rb
YESNO={true:“Yes”,false:“No”}
#./app/views/items/index.html.erb
这些都是快速而肮脏的类似PHP的解决方案。有更好的方法可以做到这一点

猴子修补术 您询问了以下问题:

。/app/lib/extensions/true\u class.rb
类真实类
迪夫耶斯诺
“是的”
结束
结束
#./app/views/items/index.html.erb
这就是所谓的“猴子补丁”Ruby类。总的来说,做你想做的事情不是一个好主意。为什么不呢?因为它破坏了一个现有的Ruby类,将该方法强制应用到所有代码中。这在极少数情况下(IMHO)是可以的,但对于将视图文本修补到逻辑类中的monkey(同样是IMHO)来说肯定不行

迁移数据类型如何? 关于创建自己的迁移数据类型,您的总体想法是正确的,但对于您的情况来说,这可能有些过分,因为布尔值是一个典型的一对一的是/否匹配。您希望何时创建自己的类型?例如,如果您希望使用不同的数据库基元类型存储是/否,例如在一个数据库中使用位标志与在另一个数据库中使用字符串枚举

装饰师 装饰器是任何应用程序的通用概念。在Rails中,装饰器是向现有模型或类添加视图逻辑的一种方法

Rails区域设置本质上是装饰器


对于更高级的需求,有一个很好的装饰宝石叫做“Draper”,它很容易使用。使用decorator有助于查看组织良好、名称空间良好且易于测试的代码。

获取设置的最简单选项是创建一个可以放入应用程序帮助程序中的帮助程序方法

# in app/helpers/application_helper.rb

def boolean_to_words(value)
  value ? "Yes" : "No"
end

这类似于许多其他Rails转换帮助程序,例如
number\u to\u currency

假设您的模型/数据库中有
:boolean
属性,您可以执行以下操作:

class Foo < ActiveRecord::Base
  def bar
    self[:bar] ? 'Yes' : 'No'
  end
end
class Foo

无论何时需要“是”/“否”值,请调用
@foo.bar
。无论何时需要
true
/
false
值,请调用
@foo.bar?
@foo[:bar]

了解如何创建帮助器。这是正确的方向。可能重复除了接受你的答案之外,我还想向你表示衷心的感谢,感谢你花时间把这些选项描述得这么好!我无法使区域设置正常工作。。。现在,当我执行
时,表中的输出显示为“TrueClass”,而不是“Yes”。我做错了什么?虽然您看到了TrueClass,但helper方法解决方案工作得很好,这是一个很好的开始。你需要像这样用#t.k.a.#translate方法来包装它:#t方法就是所谓的locales查找。我试过了,但当我使用
时,它只显示“true”和“false”。。。呃,不确定会出什么问题。。。我也尝试了
,现在我看到了所有东西的“类”。我想弄明白,虽然这看起来是最好的办法!你能编辑你的答案来反映吗?基本上,错误是在YAML文件中,你必须在“是”和“否”之间加上引号,否则它仍然会显示我是真是假
class Foo < ActiveRecord::Base
  def bar
    self[:bar] ? 'Yes' : 'No'
  end
end