如何在rails,表单构建器和错误消息中本地化日期格式?

时间:2012-05-16 16:30:41

标签: ruby-on-rails ruby-on-rails-3 datetime activerecord internationalization

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

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

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

= 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

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

有人可以与我分享如何在视图,表单构建器和活动记录错误消息中一致地本地化日期格式吗?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

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

我无法想到一个神奇的解决方案,根据具体情况对日期进行不同的格式设置并设法可靠地进行;)

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