3

我花了一天的大部分时间来尝试在我的应用程序中本地化日期。

阅读此http://guides.rubyonrails.org/i18n.html似乎 I18n.l(date) 是这样做的方法。

如果我只想在我的视图中直接渲染日期对象,这一切都很好。但是很多时候我想在表单字段中呈现日期:

= form_for @object do |f|
  .field
    = f.label :date
    = f.text_field :date

这似乎在日期对象上调用 to_s 并使用它,没有本地化。

我尝试的第一个解决方法是修改日期类以使用 I18n.l:

class Date
  def to_s
    I18n.l(self)
  end
end

这看起来不错,因为我不必记得每次渲染日期时都调用 I18n.l。但是,这样做会破坏我所有的数据库查询,因为特定于语言环境的格式在查询字符串中没有意义!

为了解决这个问题,我在补丁中添加了额外的逻辑:

class Date
  def to_s(type = nil)
    if(type == :db)
      self.strftime("%Y-%m-%d")
    else
      I18n.l(self)
    end
  end
end

然而,这仍然不适合 - 因为当使用日期验证错误时,活动记录似乎使用发送到数据库的字符串值。

谁能与我分享您将如何在您的视图、表单构建器和活动记录错误消息中一致地本地化日期格式?

谢谢你的帮助

4

1 回答 1

1

重载 Date 的 to_s 方法对我来说是一个很大的禁忌。

我想不出一个神奇的解决方案,可以根据上下文以不同的方式格式化日期并设法可靠地做到这一点;)

我建议仅在您需要的地方继续指定日期格式,并可能覆盖date.formats.default您的语言环境文件中的翻译,以使格式更适合您的用户(这也应该修复您的text_field.

于 2012-05-17T13:15:58.797 回答