我花了大部分时间尝试在我的应用程序中本地化日期。
阅读此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不合适 - 因为当使用日期进行验证错误时,活动记录似乎使用发送到数据库的字符串值。
有人可以与我分享如何在视图,表单构建器和活动记录错误消息中一致地本地化日期格式吗?
感谢您的帮助
答案 0 :(得分:1)
重载Date的to_s方法对我来说是一个很大的禁忌。
我无法想到一个神奇的解决方案,根据具体情况对日期进行不同的格式设置并设法可靠地进行;)
我建议继续只在您需要的地方指定日期格式,并可能覆盖您的语言环境文件中的date.formats.default
翻译,以使该格式更适合您的用户(这也应该修复您的格式text_field
)。