由于数据库中的默认时间是utc,我希望能够在用户正确的时间内显示它。要做到这一点,我必须把column :created_at
改为:
index do
...
column :created_at, :sortable => :created_at do |obj|
obj.created_at.localtime.strftime("%B %d, %Y %H:%M)
end
...
end
看起来很容易做一两次,但是当你需要覆盖每个索引和show方法时,这个过程会有点费力。
有没有办法覆盖ActiveAdmin显示时间的方式而不必覆盖每次出现?
我知道我可以创建一个函数或者可能更好地使用时间提供的函数,但每次我想显示时间时我仍然必须使用它。我想覆盖它而不用担心我错过了一个。
答案 0 :(得分:17)
您可以通过告诉它始终使用config/initializers/active_admin.rb
中的特定过滤器来定位ActiveAdmin,方法是添加如下所示的行:
config.before_action :set_admin_timezone
(或config.before_filter :set_admin_timezone
Rails 4之前的Rails版本)
然后在ApplicationController中,您可以定义方法set_admin_timezone,ActiveAdmin将使用它。例如:
def set_admin_timezone
Time.zone = 'Eastern Time (US & Canada)'
end
您应该能够在该方法中查找当前的管理员用户(以获取他们的特定时区),但我还没有尝试过。
答案 1 :(得分:5)
我发现有两种方法可以做到这一点:
<强> 1。的Javascript 强>
这是更简单的方法,因为它非常短并且不涉及添加db字段。它的工作原理是因为它使用浏览器中的用户时区。 This回答了解了如何执行此操作。
<强> 2。来自数据库
此过程可在this railscast。
中找到基本上在users表中存储time_zone字段。然后使用before_filter(尽管around_filter可能是个更好的主意)在控制器中设置时区。
before_filter :set_time_zone
private
def set_time_zone
Time.zone = current_user.time_zone if current_user
end
答案 2 :(得分:3)
因此,根据我的理解,您需要两件事:
LOCALTIME /时区
您可以通过设置rails应用程序的正确时区来实现此目的,默认情况下active_admin将选中该应用程序。例如,在rails配置文件(config / application.rb)中:
config.time_zone ='东部时间(美国和加拿大)'
默认时间格式