RAILS: 由于缺少 I18n 翻译导致未定义的方法 `map'

RAILS: undefined method `map' caused by missing I18n translation

我将 RAILS 4 new.html.erb 中的 datetime 字段的格式从 :string 更改为 datetime 并导致如下错误:

undefined method `map' for "translation missing: zh-CN.date.order":String

导致上述错误的视图代码为:

<%= f.input :start_time, :label => t("Start Time"), required: true, :as => :datetime, :ampm => true, :minute_step => 10, :start_year => Date.today.year - 1, :end_year => Date.today.year + 1, :format => 'YYYY/MM/DD/HH/MM', :use_month_numbers => true, :include_blank => true %>

爆炸的RAILS源代码在actionview/helpers/date_helper.rb:

def translated_date_order
  date_order = I18n.translate(:'date.order', :locale => @options[:locale], :default => [])
  date_order = date_order.map { |element| element.to_sym }  #<<<<<<===blows up

  forbidden_elements = date_order - [:year, :month, :day]
  if forbidden_elements.any?
    raise StandardError,
      "#{@options[:locale]}.date.order only accepts :year, :month and :day"
  end

  date_order
end

我在 /config/locale/ 下有一个文件 zh-CN.yml,它正在为除这个以外的其他文件提供翻译。

zh-CN.yml 的更新部分:

zh-CN:

  #maint_recordx
  Mfg Batches  : '订单批次一览'
  New Batch  : '新批次'
  Update Batch : '更新批次'
  Edit Batch : '更新批次'
...........

在被同样的错误困扰后,我发现 Rails 设置了以下键:

:'date.order'

到值:

["year", "month", "day"]

默认 :en 语言环境

您可以通过 运行 在 rails 控制台中为默认 rails 安装执行以下代码片段来确认这一点:

date_order = I18n.translate(:'date.order', :locale => :en, :default => [])

请注意,我刚刚将 @options[:locale] 切换为默认 :en

您引用的 rails 帮助程序需要一个包含 date_order 值的数组,如果得不到数组就会崩溃。

在我的例子中,我不正确地配置了 I18n::Backend::ActiveRecord gem,因此它干扰了 I18n 返回的值。您可能遇到类似的问题,导致无法返回 :'date.order' 键的正确值。

编辑:

为了解决这个问题,您可能只需要安装 gem 'rails-i18n'。它将处理为支持的语言环境返回正确的日期格式。在我的例子中,我的 es.yml 语言环境文件中有一个自定义配置返回了不正确的日期格式。

宾果!!!您只需将缺少的关键翻译添加到您的本地翻译中。 我通过添加

解决了它
en:
  date:
    order: ["day", "month", "year"]

config/locales/en.yml