我花了一天的大部分时间来尝试在我的应用程序中本地化日期。
阅读此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
然而,这仍然不适合 - 因为当使用日期验证错误时,活动记录似乎使用发送到数据库的字符串值。
谁能与我分享您将如何在您的视图、表单构建器和活动记录错误消息中一致地本地化日期格式?
谢谢你的帮助