如何更改ActiveAdmin显示时间的方式(每次)

由于数据库中的默认时间是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显示时间的方式而不必覆盖每次出现?

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

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

 config.before_action :set_admin_timezone 

(或者对于Rails 4之前的Rails版本的config.before_filter :set_admin_timezone

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

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

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

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

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 

所以根据我的理解,你需要两件事:

  1. 本地时间/时区

    您可以通过设置rails应用程序的正确时区来实现此目的,默认情况下active_admin将获取该时区。 例如,在rails配置文件(config / application.rb)中:

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

  2. 默认时间格式

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

祝你好运〜