Ruby on rails 使用designe动态设置用户时区

Ruby on rails 使用designe动态设置用户时区,ruby-on-rails,login,devise,timezone,warden,Ruby On Rails,Login,Devise,Timezone,Warden,我开发了一个rails应用程序,帮助家长跟踪婴儿的睡眠情况。为了让它正常工作,我必须支持不同的时区。为了避免时区干扰用户,我创建了一个小javascript,在登录表单中添加了一个隐藏字段,包括时区偏移量。这是密码 var timeZoneField = $("input[name='user_tz_offset']"); if (timeZoneField.length) { var browserDate = new Date(); var timeZoneOffsetS

我开发了一个rails应用程序,帮助家长跟踪婴儿的睡眠情况。为了让它正常工作,我必须支持不同的时区。为了避免时区干扰用户,我创建了一个小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
所有这些都依赖于我自己编写的登录功能。然而,我知道我以后需要使用更好的用户管理系统,因为我自己的代码既不是很好,也不是特别安全(我首先关注的是其他功能)

现在,我已经安装了Desive,它可以很好地登录和注销,站点的大多数其他功能也可以。但我不知道如何使用Desive作为我的用户管理系统来实现时区支持

一个想法是覆盖Desive中的SessionController,添加对隐藏时区字段的检查,并将其值添加到用户会话中。但我对这样做感到担忧,这感觉像是个坏主意

是否有更好的方法添加此功能,而不强制用户在注册期间添加时区信息


谢谢大家!

我管理一个调度软件,我们还检查浏览器的时区,但只需将其保存在数据库中,并在应用程序控制器中使用before_过滤器调用它

#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

经过大约八个小时的反复试验,我终于想出了一个目前有效的解决方案。也许这可能是有类似设置的人感兴趣的

首先,我向users表中添加了一列,并在模型中添加了相应的属性—
session\u tz\u offset

然后我开始用典狱长的回电到处乱搞。对我来说,有效的方法是在ApplicationController中放置一个helper方法,并使用一个before过滤器调用它,如下所示:

before_filter :authenticate_user!, :set_session_tz_offset_for_user

helper_method :set_user_time_zone, :set_session_tz_offset_for_user

def set_session_tz_offset_for_user
  Warden::Manager.after_authentication do |user, auth, opts|
    if (params[:user])
      user.session_tz_offset = params[:user][:session_tz_offset]
      user.save
    end
  end
end
登录过程中多次触发after_身份验证回调,原因我不知道。并非所有这些调用都有params[:user]字段,如果我没有检查它,我的应用程序会因nil:NilClass的
未定义方法[]而崩溃

当设置了
会话\u tz\u偏移量
时,我的其他控制器使用另一个助手方法,也在ApplicationController中定义,为当前请求设置
时区

  def set_user_time_zone
    if (user_signed_in?)
      if(user_session[:time_zone])
        Time.zone = user_session[:time_zone]
      else
        user_session[:time_zone] = 
            ActiveSupport::TimeZone.[](current_user.session_tz_offset)
        Time.zone = user_session[:time_zone]
      end
    else
      Time.zone = config.time_zone
    end
  end

谢谢,用户是选择时区还是通过javascript或ip地址“嗅探”时区?也许这是个愚蠢的问题。这里有一个更好的方法:如何将浏览器时区保存到数据库中。这是用户登录或其他地方时所做的事情吗?