Localization 在Rails 3中,我应该在哪里存储选择选项列表?

Localization 在Rails 3中,我应该在哪里存储选择选项列表?,localization,ruby-on-rails-3.1,Localization,Ruby On Rails 3.1,使用Rails 3.1.3和Ruby 1.9.3 我想给用户一个可能的日期/时间格式列表。用户的选择将存储在用户表中。然后使用I18n.localize函数格式化日期/时间值。我实际上有10种格式;以下是前两个示例: config/locales/datetime.en.yml 我的问题是在哪里存储可能的日期/时间格式列表。我已经确定了三种可能性 1.在模型中将选项列为常量: app/models/user.rb 2.创建一个应用程序常量并根据该常量进行验证: config/initialize

使用Rails 3.1.3和Ruby 1.9.3

我想给用户一个可能的日期/时间格式列表。用户的选择将存储在用户表中。然后使用I18n.localize函数格式化日期/时间值。我实际上有10种格式;以下是前两个示例:

config/locales/datetime.en.yml

我的问题是在哪里存储可能的日期/时间格式列表。我已经确定了三种可能性

1.在模型中将选项列为常量: app/models/user.rb

2.创建一个应用程序常量并根据该常量进行验证: config/initializers/constants.rb

app/models/user.rb

3.直接针对区域设置文件进行验证: app/models/user.rb

这个选项使用了一个我不熟悉的功能:I18n.t“time.format_labels”返回区域设置文件分支中所有键和值的散列。散列键是符号,所以为了得到一个字符串数组,我调用stringify_键将符号转换为字符串,然后调用键只给键不给值

选项3是最干燥的,因为我不必在两个地方列出可能的值。但是,依赖locale文件来获取可能的日期/时间格式的谨慎列表,感觉不太正确


你推荐什么?其中一个选择?还有别的吗?

我首先选择选项1,因为它简单、清晰,而且相当干燥。如果我最终在另一个模型中需要该常量,我可能会重构为选项2


选项3可能会根据区域设置表现出不同的行为,所以我不喜欢这样。如果您最终忘记在新的区域设置中指定格式标签,则选择列表可能最终为空,或者如果某个区域设置中存在拼写错误,则可能需要更长的时间才能注意到,因为该拼写错误将被视为对该区域设置有效。无论如何,在所有受支持的地区进行联合测试可能是个好主意。

谢谢Alex。有趣的是,我从选项1开始,但后来我想,datetime就像时区;它不应该绑定到一个模型,所以我开始胡闹,直到我得到选项3。在我最初的问题中,我实际上没有进入视图中的选择列表,但我倾向于直接从区域设置文件生成这些列表,类似于选项3。我的想法是,我的模型可能最终接受20种日期时间格式,但给定的区域设置可能只实现8或12种。想法?我认为这实际上也是有道理的,只要你愿意忍受我在发布我的答案后开始思考的那些案例中增加的复杂性。关键是确保如果用户更改了他们的语言环境,并且新语言环境中不支持他们的日期/时间选择,那么事情仍然有效。此外,如果您只是使用数字设置,那么这些设置可能并不真正属于该区域设置,例如,我在美国说西班牙语,所以我想要美国日期格式。在这些情况下,我通常会做一些实用/简单的事情,以避免增加复杂性。这是好的方面,特别是如果允许用户更改自己的语言环境。我也可以从模型中提取SELECT集合,如果区域设置中缺少翻译,它只会抛出一个错误。一开始我并不打算使用多个语言环境,但事实证明,语言环境文件是存储查找字符串的一种简单方法,另外,它们还可以为将来的本地化做好准备。
en:
  time:
    format_labels:
      mdyslash12: mm/dd/yyyy - hh:mm am (12-hour)
      mdyslash24: mm/dd/yyyy - hh:mm (24-hour)
    formats:
      mdyslash12: ! '%m/%d/%Y %I:%M%p'
      mdyslash24: ! '%m/%d/%Y %H:%M'
DATETIME_FORMATS = %w[mdyslash12 mdyslash24]
validates :datetime_format, :presence => true,
          :inclusion => { :in => DATETIME_FORMATS }
Rails.configuration.datetime_formats = "mdyslash12 mdyslash24"
validates :datetime_format, :presence => true,
          :inclusion => { :in => Rails.application.config.datetime_formats.split(" ") }
validates :datetime_format, :presence => true,
          :inclusion => { :in => (I18n.t 'time.format_labels').stringify_keys.keys }