2012-09-21 8 views
7

Estoy usando active_model_serializers y ember.js. Uno de mis modelos tiene un atributo de fecha. En los atributos de fecha de rieles se serializan en el formato "AAAA-MM-DD".atributos de fecha de serialización

El problema; cuando ember-data deserializa la fecha usando el constructor de fecha de javascript asume una zona horaria "incorrecta".

* Incorrecta no es la mejor palabra pero es incorrecta porque quiero que sea la predeterminada en la zona horaria actual. DS.Model date attribute parses date (YYYY-MM-DD) incorrectly

Estoy pensando que active_model_serializer debe tomar el atributo de fecha y convertirlo al formato iso8601.

Object.date.to_time_in_current_zone.iso8601 

¿Hay alguna manera de decirle a active_model_serializers cómo serializar todos los objetos de fecha? ¿O debería solucionar el problema de la zona horaria en javascript?

Respuesta

7

Aquí está mi solución actual, pero realmente siento que debería ser posible definir cómo los objetos de fecha se serializan globalmente.

class InvoiceSerializer < ActiveModel::Serializer 
    attributes :id, :customer_id, :balance 

    def attributes 
    hash = super 
    hash['date'] = object.date.to_time_in_current_zone.iso8601 if object.date 
    hash 
    end 
end 

ACTUALIZACIÓN

Mi solución preferida ahora es mono parche el método ActiveSupport::TimeWithZone.as_json.

#config/initializers/time.rb 
module ActiveSupport 
    class TimeWithZone 
    def as_json(options = nil) 
     time.iso8601 
    end 
    end 
end 

class InvoiceSerializer < ActiveModel::Serializer 
    attributes :id, :customer_id, :balance, :date 
end 
+1

También puede agregar un atributo arbitrario: 'atributos: id,: customer_id,: equilibrio,: ​​date' y luego simplemente aplicar' def date' en lugar de jugar con todos los atributos hash. – awendt

1

En la última versión de ActiveSupport (4.2) Las fechas están en formato iso8601. Ya no necesitas Monkey Patch. Se puede configurar el formato de salida

#config/initializers/time.rb 
ActiveSupport::JSON::Encoding.use_standard_json_time_format = true # iso8601 format 
ActiveSupport::JSON::Encoding.time_precision = 3 # for millisecondes 

See the doc

Cuestiones relacionadas