我开发了一个 Rails 应用程序,可以帮助 parent 跟踪婴儿的 sleep 情况。为了让它正常工作,我不得不支持不同的时区。为了避免时区惹恼用户,我创建了一个小 javascript,它向登录表单添加了一个隐藏字段,包括时区偏移量。这是代码
var timeZoneField = $("input[name='user_tz_offset']");
if (timeZoneField.length) {
var browserDate = new Date();
var timeZoneOffsetSeconds = (browserDate.getTimezoneOffset() * 60) * -1;
$(timeZoneField).val(timeZoneOffsetSeconds);
}
使用来自该字段的数据,我将 Time.zone 设置为与该偏移量对应的任何城市。像这样的东西会生成时区
user_time_zone = ActiveSupport::TimeZone.[](params[:user_tz_offset].to_i)
session[:user_time_zone] = user_time_zone
最后,我在 ApplicationController 中设置了时区。
def set_user_time_zone
if (session[:user_id])
Time.zone = session[:user_time_zone]
else
Time.zone = config.time_zone
end
end
所有这些都依赖于我自己编写的登录功能。但是,我知道我以后需要使用更好的用户管理系统,因为我自己的代码既不是很好也不是特别安全(我首先关注的是其他功能)。
现在,我已经安装了 devise 并且它可以很好地登录和注销,该站点的大多数其他功能也可以正常工作。但我不知道如何使用设计作为我的用户管理系统来处理时区支持。
一种想法是覆盖 Devise 中的 SessionsController,添加对该隐藏时区字段的检查并将其值添加到 user_session。但我对这样做感到担忧,这感觉是个坏主意。
有没有更好的方法来添加这个功能,而不强制用户在注册时添加时区信息?
谢谢!
最佳答案
我管理一个调度软件,我们还检查浏览器的时区,然后将其保存在数据库中,并在应用程序 Controller 中使用 before_filter 调用它。
#Application Controller
before_filter :set_time_zone
private
def set_time_zone
if current_user
Time.zone = current_user.time_zone if current_user.time_zone
end
end
关于ruby-on-rails - 使用设计动态设置用户时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13360875/