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

时间:2012-03-22 23:49:18

标签: localization ruby-on-rails-3.1

使用Rails 3.1.3和Ruby 1.9.3。

我想向用户提供可能的日期/时间格式列表。用户的选择将存储在Users表中。然后使用I18n.localize函数格式化日期/时间值。我实际上有10种格式;这里举例说明的是前两个:

配置/区域设置/ datetime.en.yml

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'

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

1。将选项列为模型中的CONSTANT:

应用/模型/ user.rb

DATETIME_FORMATS = %w[mdyslash12 mdyslash24]
validates :datetime_format, :presence => true,
          :inclusion => { :in => DATETIME_FORMATS }

2。创建一个应用程序常量并对其进行验证:

配置/初始化/ constants.rb

Rails.configuration.datetime_formats = "mdyslash12 mdyslash24"

应用/模型/ user.rb

validates :datetime_format, :presence => true,
          :inclusion => { :in => Rails.application.config.datetime_formats.split(" ") }

3。直接针对语言环境文件进行验证:

应用/模型/ user.rb

validates :datetime_format, :presence => true,
          :inclusion => { :in => (I18n.t 'time.format_labels').stringify_keys.keys }

此选项使用对我来说不熟悉的功能:I18n.t 'time.format_labels'返回来自语言环境文件的该分支的所有键和值的哈希值。哈希键是符号,所以为了得到一个字符串数组,我调用stringify_keys将符号转换为字符串,然后keys只给我键(没有值)。

选项#3是DRYest,因为我不必在两个地方列出可能的值。但是依赖于语言环境文件以获取可能的日期/时间格式的谨慎列表并不合适。

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

1 个答案:

答案 0 :(得分:3)

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

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