Rails:如何获取当前用户'使用Heroku时的时区

Rails: How to get the current user's time zone when using Heroku

本文关键字:使用 Heroku 时区 用户 何获取 获取 Rails      更新时间:2023-09-26

我使用将Heroku网站的时区设置为太平洋标准时间(PST)

heroku config:add TZ=America/Los_Angeles

用户的时间现在总是在PST中——无论他们是否在PST时区。

获取用户实际时区(即他们实际所在的时区)的最佳方式是什么?

我猜这可以使用Rails(或者Javascript?)来解决,而不是使用Heroku。

有两种方法可以做到这一点。

  • 实际上,您可以使用javascript获取它们的当前时间/时区。用户的计算机时间可能设置不正确,在这种情况下,您显示的时区将不正确。

    因为您使用的是Rails,所以推荐的方法是将javascript捆绑为gem,比如detect_timezone_rails。这使得它易于安装(因为它都自动捆绑在资产管道中。

  • 您可以使用IP地址来推断他们的国家和时区。这种情况下的危险在于用户可能正在使用代理。此外,虽然IP地址通常具有城市级别的分辨率,但它可能或多或少是准确的,在极少数情况下可能会给出错误的时区。

    使用IP地址,您可以获得他们的大致城市和纬度/经度。Ruby Toolbox上有很多gem可以做到这一点,例如geocoder。通过纬度/经度,您可以使用类似timezone的gem来获取时区。

您也可以使用上述选项之一,并允许用户在您的网站上手动更改时区(如果已注册,则将此设置存储在数据库中,或者将其作为浏览器上的cookie)。这在你弄错时区的情况下很有用。

根据应用程序的设置方式,有几种方法可以做到这一点。这些都不是Heroku环境独有的。

如果你的应用程序允许用户注册,那么你很可能有一个用户模型,你可能正在使用Devise gem进行身份验证/注册。在数据库(:time_zone)中添加一个字段,并在用户注册时将时区存储在此字段中。

>> rails generate migration add_time_zone_to_users time_zone:string
>> rake db:migrate

Rails为您提供了一个方便的time_zone_select表单帮助器,它为您提供一个包含所有时区的选择列表,您可以向用户显示该列表。将其添加到用户注册表单中,并允许用户在注册时设置时区。http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/time_zone_select

在应用程序控制器中,您可以执行以下操作;

before_filter :set_time_zone
def set_time_zone
    #current user is a devise method see https://github.com/plataformatec/devise
    Time.zone = current_user.time_zone if current_user
end

然后,当你在应用程序中显示日期时,在时间实例上调用.in_time_zone,它将显示用户时区中的时间。

<%= Time.now.in_time_zone %> or <%= @your_model.created_at.in_time_zone %> 

如果您没有用户身份验证,那么您可以使用javascript。要做到这一点,您可以在日期对象上使用本机javascript getTimezoneOffset(),或者更好地使用以下jsTimezoneDetect插件:

http://www.pageloom.com/automatic-timezone-detection-with-javascript

最后,您可以使用两者的混合,首先使用javascript检测它们的时区偏移,然后将该值存储在rails会话/cookie中,然后使用before_filter如上所述设置time.zone,但基于先前在javascript中计算的会话time_zone值。

或者你可以使用这个很棒的宝石https://github.com/kbaum/browser-timezone-rails