2010-01-26 8 views
0

Rails est génial, il prendra en charge le fuseau horaire dans l'application avec Time.zone. Je dois être en mesure de prendre en charge le fuseau horaire qu'un utilisateur sélectionne pour un enregistrement. L'utilisateur sera en mesure de sélectionner la date, l'heure et le fuseau horaire de l'enregistrement et je souhaite que tous les calculs soient effectués par rapport au fuseau horaire sélectionné par l'utilisateur.Modèle ActiveRecord avec horodatage avec attribut de prise en charge du fuseau horaire

Ma question est quelle est la meilleure pratique pour gérer les fuseaux horaires sélectionnés par l'utilisateur. Le modèle utilise un time_zone_select et datetime_select pour deux attributs différents timezone et scheduled_at. Lorsque le modèle enregistre, l'attribut scheduled_at est converti en Time.zone défini localement.

Lorsqu'un utilisateur retourne à modifier l'attribut scheduled_at avec le datetime_select le datetime est réglé sur le fuseau horaire converti Time.zone et non l'attribut timezone. Existe-t-il une bonne façon de gérer la conversion au fuseau horaire sélectionné par l'utilisateur?

Répondre

0

Vous pouvez gérer ceci dans un before_filter, soit dans le contrôleur spécifié ou dans l'application. Voir cet exemple:

# controllers/application.rb 
before_filter :set_user_time_zone 

private 

def set_user_time_zone 
    Time.zone = current_user.timezone if logged_in? 
end 

Ryan Bates fait un screencast à ce sujet: Time Zones in Rails 2.1

+0

J'apprécie les commentaires. C'est loin de ce que je cherche, car je n'essaie pas de le faire sur un niveau d'utilisateur pur. Ce que je pense que je dois faire est d'avoir deux horodatages, un qui représente l'heure et le fuseau horaire choisis par l'utilisateur et l'autre comme la version d'UTC. – jtarchie

+0

Je ne recommanderais pas cela, car cela aura tendance à causer une confusion sur quel horodatage représente à quelle heure. Il est préférable d'utiliser par défaut UTC pour stocker les horodatages et les convertir en avant et en arrière sur l'affichage/la mise à jour. ActiveRecord gère cela pour vous. – mikezter