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

时间:2013-07-24 22:08:22

标签: ruby-on-rails datetime 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显示时间的方式而不必覆盖每次出现?

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

3 个答案:

答案 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)

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

  1. LOCALTIME /时区

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

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

  2. 默认时间格式

    您可以参考此Change default date formatter in active admin

  3. 祝你好运〜