0

我正在使用 Ruby on Rails 4,我想以正确的方式处理 cookie 中存在的数据。也就是说,当我存储到 cookie 数据时(GMT-06:00) Central Time (US & Canada)

cookies.permanent[:time_zone] = "(GMT-06:00) Central Time (US & Canada)"

然后在 cookie 内容中存储它%28GMT-06%3A00%29+Central+Time+%28US+%26+Canada%29

这样,当我cookies[:time_zone]在代码中使用数据时

Time.use_zone(cookies[:time_zone], &block)

然后我明白了ArgumentError Invalid Timezone: (GMT-06:00) Central Time (US & Canada)

我认为问题是由于cookies[:time_zone]数据是“按原样”(%28GMT-06%3A00%29+Central+Time+%28US+%26+Canada%29)从cookie中读取的,因此在调用时会产生错误Time.use_zone

我应该如何读取/写入 cookie 数据?


@Matt Johnson 评论后更新

我的“hadcode”是

time_zone = cookies[:time_zone] || Time.zone

这样我就可以将time_zone变量用于我的事务。但是,我注意到Time.zone返回总是

(GMT-06:00) Central Time (US & Canada)
# instead of "Central Time (US & Canada)" 

这就是问题所在:在我的“硬代码”中,cookienil应该Time.zone为我的事务返回正确的值,即Central Time (US & Canada).

所以我的问题变成了:我应该如何处理这个问题才能正确设置time_zone变量?

注意Time.zone文档说明该方法

如果已设置(通过 ::zone=),则返回当前请求的 TimeZone。如果当前请求没有设置 Time.zone,则返回 config.time_zone 中指定的 TimeZone。

在我的application.rb文件中我设置了

`config.time_zone = 'Central Time (US & Canada)'`
4

1 回答 1

1

Rails 时区在此处列出。在这种特殊情况下,您应该删除字符串的第一部分并通过"Central Time (US & Canada)".

您可能还想阅读时区标签 wiki,它的底部有一个关于 Rails 时区的部分。

更新的答案

根据您的更新,我可以看到您正在使用Time.zone. 这不返回字符串,而是返回一个TimeZone对象。所以你得到的效果TimeZone.to_s()包括 GMT 部分。

您应该改用Time.zone.name,它只返回时区的字符串标识符。

于 2013-10-27T17:03:17.857 回答