2013-07-24 17 views
8

Ponieważ domyślny czas w bazie danych jest w utc, chciałem móc nadal wyświetlać go we właściwym czasie. Aby to zrobić, musiałem wziąć column :created_at i zmienić go w ten sposób:Jak zmienić sposób wyświetlania czasu przez ActiveAdmin (za każdym razem)

index do 
... 
    column :created_at, :sortable => :created_at do |obj| 
    obj.created_at.localtime.strftime("%B %d, %Y %H:%M) 
    end 
... 
end 

wydaje się dość łatwe do zrobienia raz lub dwa razy, ale gdy trzeba zastąpić każdą metodę index i pokazać, proces dostać trochę opodatkowania.

Czy istnieje sposób na przesłonięcie sposobu wyświetlania przez ActiveAdmin czasu bez konieczności przesłonięcia każdego wystąpienia?

Wiem, że mogłem utworzyć funkcję lub prawdopodobnie lepiej korzystać z funkcji przewidzianych dla czasu, ale nadal musiałbym go używać za każdym razem, gdy chcę wyświetlać czas. Chcę to zmienić, nie martwiąc się, że tęsknię.

Odpowiedz

4

Znalazłem istnieją dwa sposoby, aby to zrobić:

1. Javascript

Ta metoda jest łatwiejsza, ponieważ jest bardzo krótki i nie wymaga dodawania pole db. Działa, ponieważ używa strefy czasowej użytkowników z przeglądarki. This odpowiedź daje wgląd w to, jak to zrobić.

2. Bazy

Proces ten można znaleźć w this railscast.

Zasadniczo przechowuj w tabeli użytkowników pole time_zone. Następnie użyj filtru before_filter (chociaż lepszym rozwiązaniem może być filtr_z okolicy), aby ustawić strefę czasową w kontrolerze.

before_filter :set_time_zone 

private 
def set_time_zone 
    Time.zone = current_user.time_zone if current_user 
end 
2

Więc dla mojego zrozumienia, potrzebne są dwie rzeczy:

  1. Localtime/Strefa czasowa

    Można to osiągnąć przez ustawić właściwej strefy czasowej swojej aplikacji szynami, active_admin będzie podnieść, że domyślnie . Na przykład, w swoich szynach plik konfiguracyjny (config/environment.rb):

    config.time_zone = 'Czas wschodni (US & Kanada)' format czasu

  2. Domyślnie

    Można odwołać tę Change default date formatter in active admin

Powodzenia ~

+0

Strefa czasowa będzie specyficzna dla każdego użytkownika, więc taka konfiguracja strefy czasowej nie zadziała –

+0

Cóż, jeśli mówisz o czasie klienta, to 'obj.created_at.localtime.strftime ("% B% d, % Y% H:% M) 'nadal nie działa, ponieważ jest to nadal czas serwera, możesz wyświetlić czas klienta używając javascript –

+0

Tak, powoli dochodzę do tej realizacji. Javascript to dobre połączenie, miałem już zamiar dodać pole do bazy danych, ale byłoby to niepotrzebne. –

15

można kierować tylko ActiveAdmin informując go, aby zawsze używać określonego filtra w config/initializers/active_admin.rb, dodając linię:

config.before_action :set_admin_timezone 

(lub config.before_filter :set_admin_timezone dla wersji Rails przed Szyny 4)

Następnie w aplikacji ApplicationController można po prostu zdefiniować metodę set_admin_timezone, a ActiveAdmin jej użyje.Na przykład:

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

Powinieneś być w stanie spojrzeć w górę bieżącego użytkownika administracyjnego w tej metodzie (w celu uzyskania ich szczególną strefę czasową), ale nie próbowałem tego.

+0

Aby upewnić się, że jest ustawiony jako pierwszy: 'config. prepend_before_action -> {Time.zone = "Brisbane"} '(również kod wstawiony, ponieważ nie jest używany gdzie indziej) – Zubin

+1

Dla aplikacji Rails 5 pracuję teraz teraz użyłem 'config.before_action: set_admin_timezone' – user2001785

+0

Dzięki, zaktualizowałem swoją odpowiedź, aby to odzwierciedlić. –

Powiązane problemy