我是编程新手,但在我的应用程序中,我希望某些情况下显示"yes“或"no”,而不是"true“或"false”。我不确定这样做的最好方法,我读了this问题,但并不真正理解如何实现它。有人能帮我吗?最好是把它放在初始化器、帮助器或其他地方?我希望能够在视图中的任何我想要显示是/否的地方调用一些东西,或者创建一个自定义数据类型,在我的迁移中,我可以只创建类似t.boolean_yesno的东西,然后对每一列执行此操作,将trues存储为yes,falses存储为no。
如果能帮助我走上正轨,我将不胜感激,因为我没有使用初始化器或帮助器的经验。谢谢!
发布于 2013-02-24 10:01:31
区域设置
我推荐使用Rails语言环境。这些使您能够为任何变量定义语言文本。例如,你的应用程序可以为说英语的人说"Yes"/"No“,为说法语的人说”Oui“/”No“。
区域设置也是快速、灵活且易于更改的,因为它们独立于典型的源代码。您可以看到语言环境将如何在源代码逻辑和呈现的文本之间实现很好的分离。
示例:
#./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 %>帮助者
你可能会看到其他人像这样使用帮助器进行编码:
#./app/helpers/application.rb
def yesno(x)
x ? "Yes" : "No"
end
# ./app/views/items/index.html.erb
<%= yesno(myboolean) %>或者像这样使用一个常量:
#./app/helpers/application.rb
YESNO = {true: "Yes", false: "No"}
# ./app/views/items/index.html.erb
<%= YESNO[myboolean] %>这两个解决方案都是类似PHP的快速解决方案。有更好的方法可以做到这点。
猴子补丁
您问到了这个问题:Rails (or Ruby): Yes/No instead of True/False。
# ./app/lib/extensions/true_class.rb
class TrueClass
def yesno
"Yes"
end
end
# ./app/views/items/index.html.erb
<%= myboolean.yesno %>这就是所谓的“猴子修补”Ruby类。一般来说,这不是一个好主意去做你想做的事情。为什么不行?因为它会破坏现有的Ruby类,从而将该方法强制应用到所有代码中。这在极少数情况下(IMHO)可能是可以的,但对于将视图文本修补到逻辑类中的猴子来说肯定不是(同样是IMHO)。
迁移数据类型如何?
您对创建自己的迁移数据类型有正确的总体想法,但对于您的情况来说可能有些夸张,因为布尔值是典型的一对一的是/否匹配。你想在什么时候创建你自己的类型?例如,如果您希望使用不同的数据库原语类型来存储yes/no,例如在一个数据库中使用位标志,而在另一个数据库中使用字符串枚举。
装饰者
装饰器是任何应用程序的通用概念。在Rails中,装饰器是一种向现有模型或类添加视图逻辑的方法。
Rails locale本质上是装饰器。
对于更高级的需求,有一个很好的装饰器gem叫做"Draper“,它很容易使用。使用装饰器往往有助于视图代码组织良好、命名空间良好,并且更易于测试。
发布于 2013-02-24 10:19:27
最简单的设置选项是创建一个帮助器方法,您可以将其放入应用程序帮助器中。
# in app/helpers/application_helper.rb
def boolean_to_words(value)
value ? "Yes" : "No"
end这类似于许多其他Rails转换帮助器,如number_to_currency
发布于 2013-02-24 11:50:54
假设你的模型/数据库中有:boolean属性,你可以这样做:
class Foo < ActiveRecord::Base
def bar
self[:bar] ? 'Yes' : 'No'
end
end无论何时需要"Yes"/"No“值,都可以调用@foo.bar。只要需要true/false值,就调用@foo.bar?或@foo[:bar]。
https://stackoverflow.com/questions/15047745
复制相似问题