我正在尝试在Rails中实现正确的时区处理。
每个用户都有不同的时区,因此每个用户的时区都存在于数据库中。
问题是:当我创建一个用户时,我会将从客户端获得的信息传递到时区。
用户有一些类似created的字段,但我希望在创建用户时保存正确的时间,而在更新模型时保存而不是。
这是我的型号:
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
不起作用,因为用户没有创建。
我认为您正在寻找回调,请参阅此处的RubyonRails回调指南。
在这种情况下,您希望在创建记录时仅运行函数,因此您将使用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。