如何将Ruby on Rails用户配置文件设置为用户的本地时区?

时间:2013-11-22 13:03:49

标签: ruby-on-rails ruby ruby-on-rails-3 timezone

在我的Rails 3应用程序中,我有这个:

class Profile < ActiveRecord::Base

  belongs_to :user

  attr_accessible :time_zone

  validates_inclusion_of :time_zone, in: ActiveSupport::TimeZone.zones_map(&:name)

  before_create :set_defaults

  private

  def set_defaults
    self.time_zone = ActiveSupport::TimeZone["London"]
  end

end

当用户首次注册时,如何将其默认设置为当前用户的系统时间

现在,正如您所见,我有self.time_zone = ActiveSupport::TimeZone["London"]。但这是静态的,甚至没有超过我在上面定义的验证方法。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

有一种宝石使这很容易。

Detect Timezone Rails

其他选项包括

  • 由用户手动设置(准确,但谁想要这样做)
  • 根据电话号码或邮政编码设置(这些可能是可选字段,我的电话号码不是来自我的时区)
  • 从IP地址(代理)
  • 设置

来自手册

在你的Gemfile中:

gem 'detect_timezone_rails'

在Javascript清单中需要detect_timezone和jquery.detect_timezone(即application.js)

//= require detect_timezone
//= require jquery.detect_timezone

然后在其他地方,使用插件连接它(记得也需要jquery插件)

$(document).ready(function(){
    $('#your_input_id').set_timezone(); 
});

如果您使用标准rails形式助手来生成时区选择,您可以通过 在致电format时,set_timezone选项仅返回城市名称:

$(document).ready(function(){
    $('#your_input_id').set_timezone({format: 'city'});
})

答案 1 :(得分:1)

您的验证是检查:time_zone是否在TimeZone 名称列表中,但您正在分配实际的TimeZone对象。尝试:

def set_defaults
  self.time_zone = "London"
end

默认为当前系统的时区:

def set_defaults
  self.time_zone = (Thread.current[:time_zone] || Time.zone_default).name
end

答案 2 :(得分:0)

一个想法

Gemfile

中加入gem 'timezone'

注册后,从地址或邮政编码更新用户的时区。

登录后将时间转换为user_time.in_time_zone('timezone')