如何更改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
所以根据我的理解,你需要两件事:
-
本地时间/时区
您可以通过设置rails应用程序的正确时区来实现此目的,默认情况下active_admin将获取该时区。 例如,在rails配置文件(config / application.rb)中:
config.time_zone =’东部时间(美国和加拿大)’
-
默认时间格式
您可以在活动管理员中引用此更改默认日期格式化程序
祝你好运〜