在创建Rails之前为用户设置时区

时间:2016-03-29 12:17:23

标签: ruby-on-rails ruby api timezone

我正在尝试在Rails中实现正确的时区处理。

每个用户都有不同的时区,因此数据库中存在每个用户的时区。

问题:当我创建用户时,我会将我从客户端获得的时区传递到时区。

用户有一些像已创建的字段,但我想在创建用户时保存正确的时间,而在更新模型时

这是我的模特:

require 'securerandom'

class User
  include Mongoid::Document
  include Mongoid::Paperclip

  field :created, type: Time
  field :time_zone, type: String

  def set_created
    self.created = Time.now.in_time_zone(self.time_zone)
  end
end 

这是应用程序控制器:

class ApplicationController < ActionController::API
  include ActionController::HttpAuthentication::Token::ControllerMethods
    around_filter :set_time_zone


  def current_user
    return unless params[:user_id]
    @current_user ||= User.find(params[:user_id])
  end

  private

  def set_time_zone(&block)
    time_zone = current_user.try(:time_zone) || 'UTC'
    Time.use_zone(time_zone, &block)
  end       
end

我设置around_filter但我不知道如何将time_zone参数传递给它。 Currentuser无法正常工作,因为未创建用户。

1 个答案:

答案 0 :(得分:2)

我认为您正在寻找callbacks,请参阅Callbacks上的Ruby on Rails指南here

在这种情况下,您希望在创建记录时仅运行 功能,因此您将使用before_create

class User
  before_create :set_created

  include Mongoid::Document
  include Mongoid::Paperclip

  field :created, type: Time
  field :time_zone, type: String

  def set_created
    self.created = Time.now.in_time_zone(self.time_zone)
  end
end

请注意课程顶部的before_create。