ruby-on-rails - 使用设计动态设置用户时区

标签 ruby-on-rails login devise timezone warden

我开发了一个 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/

相关文章:

ruby-on-rails - 如何开始启动 "rvmsudo rails server"命令

ios - 如何以编程方式在 iOS 中单击 facebook loginView?

ruby-on-rails - 为什么在更新用户时 current_user session 变为 nil?

ruby-on-rails - Facebook 身份验证数据返回零,姓名和电子邮件除外

ruby-on-rails - Passenger 是否/可以使用像 Mongrel 这样的集群?

css - 如何为 DIV 的全高设置背景颜色?

使用 SourceTree 登录 Git 失败,想改为使用 SSH 创建登录

python - 如何将我的登录详细信息传递到网页?

ruby-on-rails - 设计和 Heroku 错误

ruby-on-rails - 设计 token 身份验证 - 安装设计 token 身份验证后无法创建用户帐户