Rails 3: impostazione del fuso orario sul fuso orario dell’utente corrente

Lo metto in Application Controller:

before_filter :set_timezone def set_timezone Time.zone = current_user.time_zone end 

Ma ottengo sempre l’errore:

 undefined method time_zone for # 

e io non so perché …

Spero che qualcuno possa aiutarti

    Max – l’ articolo di ryandaigle.com che hai citato link a questo articolo in cui devi creare una migrazione per aggiungere “time_zone” come attributo all’utente

    (questo è dall’articolo, nella syntax di rails 2.x)

     $ script/generate scaffold User name:string time_zone:string $ rake db:migrate 

    dopo

     <%= f.time_zone_select :time_zone, TimeZone.us_zones %> 

    Ecco perché la tua .time_zone restituisce un method_missing – non hai ancora memorizzato la time_zone sull’utente.

    Oltre alla risposta di Jesse, dovrei aggiungere che in genere è ansible evitare di aggiungere una nuova colonna in db e basta creare un metodo personalizzato nel modello utente e utilizzare i cookie per ottenere il fuso orario dell’utente:

    in client-side (js):

     function set_time_zone_offset() { var current_time = new Date(); $.cookie('time_zone', current_time.getTimezoneOffset()); } 

    nel controller dell’applicazione:

     before_filter :set_timezone def set_timezone min = request.cookies["time_zone"].to_i Time.zone = ActiveSupport::TimeZone[-min.minutes] end 
     function set_time_zone_offset() { var current_time = new Date(); $.cookie('time_zone', current_time.getTimezoneOffset()); } 

    Questo non è corretto, perché l’offset dell’ora non è costante, dipende dai periodi di ora legale. Rails si aspetta l’offset orario standard quando si chiama ActiveSupport :: TimeZone [-min.minutes] .

    ex: in Francia alla data 09/03/2013 10:50:12 +02: 00, il tuo javascript restituirà -120 come offset dove ActiveSupport avrà bisogno di -60 per risolvere il fuso orario della Francia.

    Quindi è necessario verificare se si tratta di un periodo di ora legale in JS, quindi se questo è il caso, sarà necessario sottrarre un’ora all’offset per ottenere il valore corretto utilizzato da Rails.