如何将作为 TZInfo 标识符接收的 js 值转换为 Rails TimeZone 名称/键?
FROM:"America/New_York"
从 JavaScript TZinfo 检测返回
TO:"Eastern Time (US & Canada)"
Rails TimeZone 中使用的约定
或另一个例子:
"Pacific/Honolulu"
=> 转换为 =>"Hawaii"
两者都在ActiveSupport::TimeZone < Object
映射中可用,但 rails "Eastern Time (US & Canada)"
在下拉、验证和存储到Time.use_zone()
.
根据我对这一点的理解,ActiveSupport::TimeZone.us_zones
这似乎很重要,尤其是在 DayLights 节省时间(轨道声音处理得很好)和仅匹配偏移量的情况下。如果未使用 rails TimeZone 名称将其存储到 DB,则验证失败,并且在用户的配置文件设置页面中与下拉列表不匹配ActiveSupport::TimeZone.zones_map
这样做的目标是用户不必在注册时选择他们的时区,或者在注册后在他们的设置中进行更改。浏览器检测到它并在注册时将其传递给 hidden_field。在极少数情况下,他们会在不同于家庭/工作的地方注册。他们可以稍后在其帐户设置中手动覆盖。
尝试摄取 js 时区检测时似乎是一个常见的差距。这甚至可能成为次要问题,如何将返回的信息从 js 传递到 rails 进行转换,然后返回 js 以存储回表单的 hidden_field 中?希望我正确地提出了这个问题并且诚然有点绿色,所以可能有一个简单的解决方案......
非常感谢所有的帮助!
-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
*使用设计和设计-不可避免
注册查看脚本
<script>
$(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 !
});
</script>
用户模型
validates_inclusion_of :time_zone, in: ActiveSupport::TimeZone.zones_map(&:name)
用户帐户设置表单
<%= f.label :time_zone, label: "Time Zone" %><br />
<%= f.time_zone_select :time_zone, ActiveSupport::TimeZone.us_zones %>