(GoRails) 自动侦测用户的时区,使用javascript 的jszt库。

Posted Mr-chen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(GoRails) 自动侦测用户的时区,使用javascript 的jszt库。相关的知识,希望对你有一定的参考价值。

 传统方法见:http://www.cnblogs.com/chentianwei/p/9369904.html

 ⚠️: 两个方法最后都要有controller中的类似before_action :set_time_zone来给当前浏览器分配时区。

 实时方法,根据user的时区设置:

  1. rails new -m template.rb timezone 使用模版,名字用timezone
  2. yarn add jstz   #一个javascrit timezone library 可以自动侦测和设置用户的time zone。
  3. rails g migration AddTimeZoneToUsers time_zone
  4. rails db:migrate
  5. atom.后打开javascript/packs/application.js(已经安装使用webpacker)
  6. 输入import jstz from \'jstz\'
    1. import jstz from \'jstz\'
    2. const timezone = jstz.determine()
    3. console.log(timezone.name())
  7. app/views/shared/_head.html.erb
  8. 修改第8行,改为 javascript_pack_tag方法。
  9. 在user注册页,f.time_zone_select :time_zone选项,通过它可以在inspect上看到时区的选择。
  10. 在javascript/packs/application.js设置cookie:

创建函数--设置一个Cookie:

 function setCookie(name, value) {

  var expires = new Date()

  expires.setTime(expires.getTime() +  (24*60*60*1000))  #1000天后到期

  document.cookie = name + \'\'=" + value + \';expires=\' + expires.toUTCString()

}

使用这个函数:

setCookie("timezone", timezone.name())

 

解析这些都是JavaScript的用法,create, Read a Cookie with JavaScript:

var x = document.cookie      获得当前document的关联的cookies。

document.cookie = newCookie 设置新的Cookie。

例子:

document.cookie= "username=John Doe;   expires=Thu, 18 Dec 2013 12:00:00 UTC;   path=/";

扩展--JavaScript Cookies:

https://www.w3schools.com/js/js_cookies.asp

  

  12. 在Application.rb中 Controller中定义一个方法 bowser_time_zone

def browser_time_zone

  #根据cookies来找到对应的时区,如果没有则使用Time.zone作为默认,任意错误,营救也使用默认

  browser_tz = ActiveSupport::TimeZone.find_tzinfo(cookies[:timezone])

  ActiveSupport::TimeZone.all.find{ |zone|  zone.tzinfo ==  browser_tz }  || Time.zone

rescue TZInfo::UnknownTimezone,  TZInfo::InvalidTimezoneIdentifier

  Time.zone

end

helper_method :browser_time_zone  #添加helper方法

 

变量browser_tz是如#<TZInfo::DataTimezone: America/Chicago>的对象, 它会和所有TimeZone对象的属性tzinfo做比较。

#<ActiveSupport::TimeZone:0x00007f97f26b0058 @name="American Samoa", @utc_offset=nil, @tzinfo=#<TZInfo::DataTimezone: Pacific/Pago_Pago>>

 

  13.在user注册页,f.time_zone_select :time_zone选项可以加上这个browser_time_zone helper方法

<%= f.time_zone_select :time_zone, nil, default: browser_time_zone.name %>

 

 

  14. 浏览器显示时区时间:controller增加一个before_action :set_time_zone, if: :user_signed_in?

def set_time_zone

  Time.zone = current_user.time_zone

end

  15 有一个相关gem \'local_time\'可以利用。

以上是关于(GoRails) 自动侦测用户的时区,使用javascript 的jszt库。的主要内容,如果未能解决你的问题,请参考以下文章

未来智能眼镜新方向:红外传感图像识别侦测声音方位自动清洁镜片。。。

Django会自动检测最终用户的时区吗?

苹果自驾车传新进展,自动侦测交通技术有眉目

ActionCable的部署(参考Gorails)

(GoRails) 如何去掉form输入框头尾的空格;何时用callbacks,gem;

(Gorails) 用decorators来取代helper model; delegate()方法