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

Posted

技术标签:

【中文标题】Rails:使用Heroku时如何获取当前用户的时区【英文标题】:Rails: How to get the current user's time zone when using Heroku 【发布时间】:2012-09-01 20:05:15 【问题描述】:

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

heroku config:add TZ=America/Los_Angeles

用户的时间现在始终采用 PST——无论他们是否处于 PST 时区。

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

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

【问题讨论】:

我一直在浏览 Web,似乎我需要在客户端用 JS 做一些事情并将其传回服务器。请指教。 【参考方案1】:

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

确实,您可以使用 javascript 来获取他们当前的时间/时区。有可能是用户的电脑时间设置不正确,这样你显示的时区就不正确了。

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

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

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

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

【讨论】:

【参考方案2】:

根据您应用的设置方式,您可以通过多种方式执行此操作。这些都不是 Heroku 环境独有的。

如果您的应用允许用户注册,那么您很可能拥有一个 User 模型,并且您可能正在使用 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 session/cookie 中,然后使用 before_filter 设置 Time.zone 如上所述,但基于会话 time_zone以前在 javascript 中计算的值。

【讨论】:

【参考方案3】:

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

【讨论】:

显然这种方法有问题,因为它依赖于引擎盖下的 jstimezone。 ***.com/questions/30756405/…

以上是关于Rails:使用Heroku时如何获取当前用户的时区的主要内容,如果未能解决你的问题,请参考以下文章

如何从heroku中的rails应用程序获取完整的production.log?

Rails friendly_id 不会在 heroku 上的现有用户上呈现

如何使用 Heroku/Rails 4 应用程序设置新的 Redshift 数据库

使用 Twitter API 时 Heroku 出错

如何使用Rails和Heroku创建多个并行并发请求

如何将 Rails + Webpacker 应用程序部署到 Heroku?