【问题标题】:How to change how ActiveAdmin displays time (every time)如何更改 ActiveAdmin 显示时间的方式(每次)
【发布时间】:2013-07-24 14:46:42
【问题描述】:

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

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

【问题讨论】:

    标签: ruby-on-rails datetime activeadmin


    【解决方案1】:

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

    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
    

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

    【讨论】:

    • 为了确保它首先被设置:config.prepend_before_action -> { Time.zone = "Brisbane" }(也是内联代码,因为它没有在其他地方使用)。
    • 对于我现在正在开发的 Rails 5 应用程序,我需要使用 config.before_action :set_admin_timezone
    • 这似乎不是一个好的解决方案。这将为 activeadmin 设置时区,但它也会为其他控制器操作设置它,但它似乎是间歇性的。我在我的一个应用程序控制器操作中删除了一个调试器,并打印出 Time.zone,它有时会间歇性地打印 UTC,有时会间歇性地打印 EST。
    • @dkniffin 尝试将调试器放在set_admin_timezone 中,看看它是否曾经被您的其他控制器操作调用。如果是,那么您可能是从应用程序中的其他位置调用它。如果不是,那么您的应用程序的其他部分可能正在设置时区。
    • 是的,@dkniffin 是正确的,这可能会导致问题 - 任何没有明确 Time.zone 分配的操作都可能因此具有不确定的时区。时区也需要在请求结束时被拆除。例如参见“ilikestuffblog.com/2011/02/03/…”。
    【解决方案2】:

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

    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
    

    【讨论】:

      【解决方案3】:

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

      1. 当地时间/时区

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

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

      2. 默认时间格式

        你可以参考这个Change default date formatter in active admin

      祝你好运~

      【讨论】:

      • 时区对每个用户来说都是特定的,所以这样配置时区是行不通的
      • 好吧,如果你说的是客户端时间,那么obj.created_at.localtime.strftime("%B %d, %Y %H:%M)还是不行,因为这仍然是服务器时间,你可以使用javascript显示客户端时间。
      • 是的,我正在慢慢意识到这一点。 javascript 是一个很好的调用,我正要为它添加一个字段到数据库,但那是不必要的
      • @Zubin 日期时间始终以 UTC 格式存储,无论该配置选项如何(这只会影响默认情况下的显示方式)
      猜你喜欢
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      相关资源
      最近更新 更多