2009-06-03 19 views
14

Javascript sulla mia pagina salva l'offset UTC del cliente sul cookie. Come uso questo cookie per creare un TimeZone e assegnarlo a Time.zone?Imposta il fuso orario corrente in Rails?

Ho bisogno di qualcosa di simile:

before_filter :set_time_zone 

def set_time_zone 
    Time.zone = ActiveSupport::TimeZone.new('my timezone', cookies[:timezone]) 
end 

salvo che la parte destra di questa espressione non funziona e non sono sicuro se sto andando nel modo giusto qui. Non ce la faccio

risposta

14

Ecco il lavoro risposta Googled:

min = cookies[:timezone].to_i 
Time.zone = ActiveSupport::TimeZone[-min.minutes] 

Giusto per chiarire, la parte javascript:

if(!($.cookie('timezone'))) { 
    current_time = new Date(); 
    $.cookie('timezone', current_time.getTimezoneOffset(), { path: '/', expires: 10 }); 
} 
+0

Potrebbe anche essere necessario per rimuovere tale >>> if (! ($. biscotto ('fuso orario'))) <<< condizioni, così come i visitatori del sito possono viaggio e c'è bisogno di aggiornare il loro valore di fuso orario. – yek

+1

Un piccolo problema: il 'TimeZone [-min.minutes]' restituisce il primo fuso orario disponibile con l'offset 'min.minutes'. Ad esempio, per Tokyo restituisce Irkutsk. Quindi questo metodo funzionerebbe se non fosse necessario visualizzare il nome o il codice del fuso orario. – arkadiy

+2

@arkadiy ha ragione, ma questo non è solo un problema _piccolo_ perché si possono ottenere fusi orari che non osservano l'ora legale (DST). In questo caso il risultato è un momento sbagliato. Inoltre 'new Date(). GetTimezoneOffset()' restituisce l'offset corrente compreso l'ora legale, ma la selezione 'ActiveSupport :: TimeZone []' prevede l'offset del fuso orario standard, quindi è necessario aggiornare la funzione javascript [come questa] (http://bit.ly/timezone_js). Puoi vedere [questo thread] (https://github.com/potomak/tomatoes/issues/8#issuecomment-2167461) sul problema se vuoi saperne di più. –

3

Quando l'ho memorizzata nel mio modello d'uso è semplice come questo

def set_time_zone 
    Time.zone = current_user.time_zone unless current_user.blank? 
end 

così forse si potrebbe fare

def set_time_zone 
    Time.zone = cookies[:timezone] 
end 

Questo è non provato, non ho mai provato a farlo da un cookie, penso che abbia più senso archiviarlo nel modello User.

+0

No, non è necessario memorizzarlo nel modello utente. Ad ogni modo, che aspetto ha la tua attuale current_user.time_zone? È una stringa? – snitko

+1

Sì, usando solo i Rails integrati nel fuso orario, quindi per il mio utente in un'app sarebbe solo "Sydney" – nitecoder

+0

In genere, l'accesso a oggetti come sessione e cookie in Model (parte M di MVC) non è una buona pratica – yek

6

@snitko - mi si risponde ha lavorato molto per me per un lungo periodo di tempo. Tuttavia, come ha sottolineato @Giovanni, in alcuni scenari non tiene conto dell'ora legale, in quanto mette a disposizione il primo fuso orario dato l'offset dei minuti. Ho trovato una risposta semplice e funzionante che tiene conto dell'ora legale.

Testa qui - , è un rilevatore di fuso orario javascript. Basta copiare il codice javascript collegato dal sito Web (o a destra here) in uno dei file javascript della tua app (application.js funziona correttamente). Ti consente di recuperare il fuso orario tramite un oggetto denominato jstz.

Poi, nel application.html.erb ho

<script type="text/javascript"> 

    var timezone = jstz.determine(); 
    document.cookie = 'time_zone='+timezone.name()+';'; 

</script> 

E in application_controller.rb, ho

before_filter :set_timezone 

private 
def set_timezone 
    Time.zone = cookies["time_zone"] 
end 

E questo è tutto ciò che serve! Il fuso orario è impostato correttamente per l'app Rails.

MODIFICA: È possibile che sia necessario inserire il codice di impostazione del cookie javascript dopo il tag <\body> in application.html.erb a causa del diverso modo e dell'ordine i file javascript sono caricati.

+0

Ehi, lo so da molto tempo .. ma sto facendo questo. Potresti chiarire l'ultima riga? E non è necessario aggiornare la pagina una volta impostato il cookie, per influire sulla pagina corrente? –

+0

L'ultima riga imposta il fuso orario come configurazione globale per l'applicazione. Se molti utenti colpiscono l'applicazione da diversi fusi orari, questo potrebbe non essere l'approccio migliore (rispetto all'impostazione del fuso orario su un singolo utente). Ma sì, sei corretto, avresti bisogno di aggiornare la pagina in modo che il server visualizzi la pagina con il fuso orario aggiornato per vedere eventuali modifiche relative al tempo. – efatsi

+0

Ehi, credo che Time.zone sia sicuro e, fintanto che lo imposti su ogni richiesta, non penso che dovrebbe interferire tra le richieste giusto? In realtà intendevo anche il tuo EDIT: la linea che parla della collocazione dei cookie alla fine? –

Problemi correlati