2010-11-24 9 views
8

Pongo esto en Controlador de aplicación:Rails 3: Ajuste de la zona horaria a los usuarios actuales de zona horaria

before_filter :set_timezone 

def set_timezone 
Time.zone = current_user.time_zone 
end 

pero siempre me sale el error:

undefined method time_zone for #<User:0xa46e358> 

y yo no sé por qué ...

espero que alguien pueda ayudar

+0

¿Por qué crees que esto debería funcionar? current_user.time_zone –

+0

http://ryandaigle.com/articles/2008/1/25/what-s-new-in-edge-rails-easier-timezones – Max

Respuesta

11

Max - la ryandaigle.com article usted ha mencionado enlaces a this writeup donde es necesario crear una migración a añadir "time_zone" como un atributo para el usuario

(esto es del artículo, en la sintaxis 2.x rieles)

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

tarde

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

Es por eso que tu .time_zone devuelve un método_desperdicio - aún no has almacenado el time_zone en el usuario.

+0

Thx que fue útil. – Max

+0

¿Hay alguna manera de obtener la zona horaria de un usuario que no está en la base de datos y que solo está visitando el sitio? – Max

+1

Esto podría ser útil (obtenerlo en javascript) - http://www.w3schools.com/jsref/jsref_getTimezoneOffset.asp –

25

con la respuesta de Jesse, debo añadir que se puede evitar en general, la adición de una nueva columna en db y simplemente crear un método personalizado en el modelo de usuario y hacer uso de cookies para obtener zona horaria del usuario:

en el lado del cliente (JS):

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


en controlador de aplicación:

before_filter :set_timezone 

def set_timezone 
min = request.cookies["time_zone"].to_i 
Time.zone = ActiveSupport::TimeZone[-min.minutes] 
end 
+10

+1 para tratar de determinar la zona horaria a partir de la información disponible sin que el usuario la proporcione de manera explícita. Sin embargo, este es un método poco confiable de hacer esto. En un entorno de producción, le conviene usar algo [como este] (https://bitbucket.org/pellepim/jstimezonedetect/src/ab0cfa941246/detect_timezone.js) para detectar la zona horaria con mayor precisión, y siempre debe almacenar esto y permitir el usuario para anularlo – coreyward

+0

El uso de cookies es perfecto, pero ¿qué podemos hacer si alguien borra las cookies o no las permite? – user1780370

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

Esto no es correcto, porque desplazamiento de tiempo no es constante, que depende de los períodos de horario de verano. Rails espera la compensación de tiempo estándar al llamar a ActiveSupport :: TimeZone [-min.minutes].

ex: en Francia a la fecha 09/03/2013 10:50:12 +02: 00, su javascript devolverá -120 como compensación donde ActiveSupport necesitará -60 para resolver la zona horaria de Francia.

Luego debe verificar si esto es un daylight saving time period in JS y si este es el caso, deberá restar una hora al desplazamiento para obtener el valor correcto utilizado por Rails.

Cuestiones relacionadas