16

由于数据库中的默认时间是 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

做一次或两次似乎很容易,但是当您需要覆盖每个索引和显示方法时,该过程有点费力。

有没有办法覆盖 ActiveAdmin 如何显示时间而不必覆盖每次出现的时间?

我知道我可以创建一个函数或者可能更好地使用为时间提供的函数,但是每次我想显示时间时我仍然必须使用它。我想覆盖它而不用担心我错过了一个。

4

3 回答 3

22

您可以通过告诉 ActiveAdmin 始终使用特定的过滤器来定位 ActiveAdmin config/initializers/active_admin.rb,方法是添加如下一行:

config.before_action :set_admin_timezone

(或config.before_filter :set_admin_timezoneRails 4 之前的 Rails 版本)

然后在您的 ApplicationController 中,您只需定义方法 set_admin_timezone,ActiveAdmin 将使用它。例如:

def set_admin_timezone
  Time.zone = 'Eastern Time (US & Canada)'
end

您应该能够以该方法查找当前的管理员用户(以获取他们的特定时区),但我还没有尝试过。

于 2014-04-01T16:06:35.530 回答
7

我发现有两种方法可以做到这一点:

1. Javascript

这是更简单的方法,因为它很短并且不涉及添加 db 字段。它之所以有效,是因为它使用浏览器中的用户时区。 答案提供了有关如何执行此操作的见解。

2. 从数据库

这个过程可以在这个 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
于 2013-07-25T17:29:56.187 回答
4

因此,根据我的理解,您需要两件事:

  1. 本地时间/时区

    您可以通过设置 Rails 应用程序的正确时区来实现这一点,默认情况下 active_admin 会选择它。例如,在您的 rails 配置文件(config/application.rb)中:

    config.time_zone = '东部时间(美国和加拿大)'

  2. 默认时间格式

    您可以在活动管理员中参考此更改默认日期格式化程序

祝你好运~

于 2013-07-25T05:15:17.360 回答