如何将TZInfo标识符转换为Rails TimeZone名称/密钥
如何将作为TZInfo标识符接收的js值转换为Rails TimeZone名称/密钥?
FROM: "America/New_York"
从JavaScript TZinfo检测返回
TO:Rails TimeZone中使用的"Eastern Time (US & Canada)"
惯例
或者另一个例子:
"Pacific/Honolulu"
=>转换为=> "Hawaii"
两者都可以在ActiveSupport::TimeZone < Object
mapping中使用,但rails在下拉,validation和存储到Time.use_zone()
使用密钥[ig "Eastern Time (US & Canada)"
]。
基于我对ActiveSupport::TimeZone.us_zones
理解,这似乎很重要,尤其是DayLights节省时间(轨道声音可以很好地处理),并且只能匹配偏移量。 如果没有使用rails TimeZone名称存储到DB,则validation失败并且在用户的配置文件设置页面中与ActiveSupport::TimeZone.zones_map
的下拉列表无法正确匹配
这样做的目的是用户不必在注册时选择他们的时区,或者在注册后需要在他们的设置中更改它们。 浏览器检测到它并在注册时将其传递给hidden_field。 在极少数情况下,他们在与家庭/工作不同的地方注册。 他们可以稍后在其帐户设置中手动覆盖。
在尝试摄取js时区检测时似乎是一个常见的差距。 这甚至可能成为如何将返回的信息从js传递给rails进行转换然后返回js以存储回表单的hidden_field的次要问题? 希望我正确地解决了这个问题,并且确实有一些带有rails的绿色,所以可能有一个简单的解决方案……
非常感谢所有的帮助!
-E
ActiveSupport Time.zone文档
http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html#method-i-parse
MAPPING = {"Eastern Time (US & Canada)" => "America/New_York"
使用js打包gem’temporal-rails’来检测用户时区:
https://github.com/jejacks0n/temporal
用户Time_Zone实现如下所示:
http://railscasts.com/episodes/106-time-zones-revised
*使用设计和设计 – 不可避免
注册视图脚本
$(function() { var detected_zone = Temporal.detect(); console.log(detected_zone); // returns object detected_zone = detected_zone.timezone.name; console.log(detected_zone); // returns "America/New_York" $('#user_time_zone').val(detected_zone); // ! need to convert this to rails TimeZone name ! });
用户模型
validates_inclusion_of :time_zone, in: ActiveSupport::TimeZone.zones_map(&:name)
用户帐户设置表单
时间包括所需的逻辑,但回答你的问题:
Time.zone = ActiveSupport::TimeZone.new("America/New_York")
编辑,我想我的答案是不完整的。 你想把它从“America / New_York”带到“东部时间(美国和加拿大)”,对吗? 如果是这种情况,这是我的最佳解决方案 – 尽管有人可能能够提供更好的解决方案。
ActiveSupport::TimeZone::MAPPING.select {|k, v| v == "America/New_York" }.keys.first
- 长期无安全方法链
- 如何在Ruby中将JSON转换为XML?
- 无法加载require_dependency
- 测试使用ActiveRecord的问题/模块
- Ruby没有找到新版本的OpenSSL
- 未初始化的常量TZInfo :: InvalidTimezoneIdentifier(NameError) – Rails 4
- 在Rails 4.1中,validates_inclusion_of不再一样吗?
- NoMethodError:ActiveSupport的未定义方法`halt_callback_chains_on_return_false =’:模块
- ActiveSupport :: JSON.decode无法正确处理文字换行符