2013-07-24 2 views
8

Poiché l'ora predefinita nel database è in utc, volevo poterla visualizzare ancora nell'ora corretta dell'utente. Per fare questo ho dovuto prendere column :created_at e cambiare in questo modo:Come modificare il modo in cui ActiveAdmin visualizza l'ora (ogni volta)

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

sembra abbastanza facile da fare una volta o due, ma quando è necessario sostituire ogni metodo indice e spettacolo, il processo di ottenere un po 'faticoso.

C'è un modo per sovrascrivere il modo in cui ActiveAdmin visualizza l'ora senza dover ignorare ogni occorrenza?

So che potrei creare una funzione o probabilmente usare meglio le funzioni fornite per il tempo, ma dovrei comunque usarlo ogni volta che voglio visualizzare il tempo. Voglio ignorarlo senza preoccuparmi di averne perso uno.

risposta

4

ho trovato ci sono due modi per farlo:

1. Javascript

questo è il metodo più facile perché è molto breve e non comporta l'aggiunta di un campo di db. Funziona perché utilizza il fuso orario degli utenti dal proprio browser. La risposta This fornisce informazioni su come eseguire questa operazione.

2. Dal database

Questo processo può essere trovato in this railscast.

Memorizza essenzialmente un campo time_zone nella tabella utenti. Quindi usa un before_filter (anche se un around_filter potrebbe essere un'idea migliore) per impostare il fuso orario nel controller.

before_filter :set_time_zone 

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

Così per la mia comprensione, avete bisogno di due cose:

  1. Localtime/timezone

    È possibile raggiungere questo obiettivo impostare il diritto fuso orario della vostra rotaie app, l'active_admin preleverà che di default . Ad esempio, nelle rotaie file di configurazione (config/application.rb):

    config.time_zone = 'Eastern Time (US & Canada)' formato ora

  2. predefinito

    è possibile fare riferimento questo Change default date formatter in active admin

Buona fortuna ~

+0

Il fuso orario sarà specifico per ciascun utente, quindi la configurazione del fuso orario non funzionerà. –

+0

Bene, se si sta parlando dell'ora del client, quindi 'obj.created_at.localtime.strftime ("% B% d, % Y% H:% M) 'non funziona ancora, perché questa è ancora l'ora del server, è possibile visualizzare l'ora del client utilizzando javascript. –

+0

Sì, sto lentamente arrivando a questa realizzazione. Javascript è una buona chiamata, però, stavo per aggiungi un campo al db per questo, ma non sarebbe necessario –

15

è possibile destinare solo ActiveAdmin dicendo è di usare sempre un filtro particolare config/initializers/active_admin.rb, con l'aggiunta di una riga come questa:

config.before_action :set_admin_timezone 

(o config.before_filter :set_admin_timezone per le versioni di Rails prima Rails 4)

Quindi nel tuo ApplicationController, puoi semplicemente definire il metodo set_admin_timezone e ActiveAdmin lo userà.Per esempio:

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

Dovrebbe essere possibile cercare l'utente amministratore corrente in quel metodo (al fine di ottenere la loro particolare fuso orario), ma non ho provato.

+0

Per assicurarsi che sia impostato per primo: 'config. prepend_before_action -> {Time.zone = "Brisbane"} '(anche codice inarcato poiché non è usato altrove) – Zubin

+1

Per l'app Rails 5 su cui sto lavorando ora I nee ded per usare 'config.before_action: set_admin_timezone' – user2001785

+0

Grazie, ho aggiornato la mia risposta per riflettere questo. –