Rails:如何获取当前用户'使用Heroku时的时区
Rails: How to get the current user's time zone when using Heroku
我使用将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
- Rails:如何获取当前用户'使用Heroku时的时区
- 如何使用Bootstrap和Heroku为Rails应用程序添加隐藏的播放音频
- 使用Heroku上的node mailer发送延迟的电子邮件
- 使用 Heroku 部署 Node.js 应用程序时公共目录出现问题
- 使用解析服务器的后台作业&Heroku调度器
- 使用 heroku 运行 angularjs 种子应用程序时出错
- 使用带有严格标志的 db.collection 在 Heroku 中不起作用
- 如何使用node-mongodb-native连接到Heroku
- 强制 heroku 使用特定版本的 Node.js
- 如何使用Python/Flask在heroku中显示index.html页面
- 关于为什么我不能在jsforce-auth函数中使用heroku环境变量的任何线索
- 在Heroku上使用Mongo.db的Node.js应用程序
- 使用Heroku进行套接字轮询时响应时间长
- 使用node.js时Heroku部署错误
- 使用Node.JS刷新api查询;Heroku
- 在Heroku上使用基于插件的架构的应用程序中,我应该如何处理节点模块依赖关系
- 如何在heroku上使用webpack部署angularjs应用
- 试图将我的Node.js应用程序推送到Heroku,错误:使用jade npm的ENOENT
- Ajax调用不能在heroku上使用大量数据
- Node.js -将画布保存为图像[用于使用Amazon S3的Heroku托管应用程序]