zoukankan      html  css  js  c++  java
  • (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'可以利用。

  • 相关阅读:
    当一组单选按钮中的一个选中,后文本框为只读属性
    在.net 环境下,进行了伪静态页面处理后,后台的Fckeditor就不能正常显示了
    PL/SQL Developer 8注册码
    选中checkbox后才能填写输入框
    net 试图加载格式不正确的程序。(Exception from HRESULT: 0x8007000B)
    在sql中将varchar型转换成int型再进行排序
    ASP.NET中显示农历时间
    改变自己,拥抱生活
    人生最不值得你去做的事情
    Oracle 中的周、月、日历的查询实现
  • 原文地址:https://www.cnblogs.com/chentianwei/p/9580059.html
Copyright © 2011-2022 走看看