繁体   English   中英

使用JavaScript从客户端在Rails上设置时区

[英]Setting timezone on Rails from clientside using javascript

我有一个设置时区的webapp

post_controller.rb

before_filter :set_time_zone
def set_time_zone
  Time.zone = user.time_zone
end

现在,我没有想从注册时从用户那里获取time_zone,而是想知道如何从客户端动态设置时区并将其设置在before_filter中。 我正在尝试使用detect_timezone_rails gem gem提供了一种简单的方法来访问客户端时区,只需从js文件中调用此类函数即可。

$(document).ready(function(){
    $('#your_input_id').set_timezone(); 
});

现在,以上代码自动设置了hiddenfield输入或select输入,但是我想知道您是否可以简单地使用函数调用保存到会话并从Rails服务器检索它。 我猜想当用户第一次访问该站点时,可以设置时区,而会话值可以用于为其余访问设置时区。 我认为可以使用session值在before过滤器中设置时区。 对于javascript来说还很陌生,我不确定如何访问Rail的加密cookie存储来设置值。 这可能吗? 如果是这样,我该怎么办? 提前致谢,

#javascript
function readCookieValue(cookieName)
{
  return (result = new RegExp('(?:^|; )' + encodeURIComponent(cookieName) + '=([^;]*)').exec(document.cookie)) ? decodeURIComponent(result[1]) : null;
}

$(document).ready(function(){

if(readCookieValue("time_zone") === null) {
  $.post('/set_time_zone',
       { 'offset_minutes':(-1 * (new Date()).getTimezoneOffset())});
}

#controller:
def set_time_zone
  offset_seconds = params[:offset_minutes].to_i * 60
  @time_zone     = ActiveSupport::TimeZone[offset_seconds]
  @time_zone     = ActiveSupport::TimeZone["UTC"] unless @time_zone
  if @time_zone
    cookies[:time_zone] = @time_zone.name if @time_zone
    render :text => "success"
  else
    render :text => "error"
  end
end

我们这样做有些不同。 如果要从JS收集时区,可以使用gon gem在Rails侧设置一个变量。 然后,我们在客户端上具有检查该变量的JS代码,并且如果设置了该代码 ,则使用jstimezonedetect脚本返回的时区字符串将XHR发布到端点(如OP一样),该脚本返回一个IANA时区密钥。 最后,要将其转换为Rails 3.2.19时区名称,我们做了ActiveSupport::TimeZone::MAPPING.invert[iana_key] 它采取了一些步骤来解决此问题,希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM