2010-08-21 5 views
11

Je souhaite sortir un de ces champs de sélection pour que l'utilisateur sélectionne son fuseau horaire. Mon modèle d'utilisateur enregistre le fuseau horaire sous la forme d'un entier en secondes. Mais je peux changer cela si ce n'est pas pratique.Champ TimeZone Select dans Ruby on Rails

Quelque chose comme ceci:

<select> 
    ... 
    <option value="x">+9:00 (Darwin, Australia)</option> 
    <option value="x">+10:00 (Sydney, Australia)</option> 
    ... 
</select> 

Je vois qu'il ya une classe à temps Ruby on Rails ... Quelqu'un peut-il me diriger dans la bonne direction?

Répondre

32

Vous pouvez stocker un fuseau horaire sous forme de chaîne.

def self.up 
    add_column :users, :time_zone, :string, :limit => 255, :default => "UTC" 
    end 

Utilisez cette option pour afficher la boîte de sélection

<%= f.time_zone_select :time_zone %> 
+1

Oui, j'ai vu ce lien avant! Merci de votre aide. – Rimian

+1

Génial. C'est ce que je cherche. Merci. –

+4

Le lien semble être obsolète et dirige le trafic vers les critiques de films grecs? – Jay

1
timezones_diff_and_name = [] 
    TZInfo::Timezone.all_linked_zones.each do |tz| 
    timezones_diff_and_name << {tz.name => tz.current_period.utc_total_offset/(60 * 60)} 
    end 

    sorted_timezones = timezones_diff_and_name.sort_by { |timezone| timezone.values[0] } 

    @timezones = {} 
    sorted_timezones.each do |tz| 
    diff = tz.values[0] 
    name = tz.keys[0] 
    @timezones["(GMT#{diff > 0 ? '+':''}#{diff.to_s}h) #{name}"] = name 
    end 

Toute personne ayant un meilleur/plus propre solution? Je suis au lit :)