2012-09-21 7 views
7

Sto usando active_model_serializers e ember.js. Uno dei miei modelli ha un attributo data. In rails gli attributi di data sono serializzati nel formato "YYYY-MM-DD".serialize date attributes

Il problema; quando ember-data decodifica la data utilizzando il costruttore di date javascript, assume un fuso orario "errato".

* Errato non è la parola migliore, ma non è corretto perché lo voglio per impostazione predefinita per il fuso orario corrente. DS.Model date attribute parses date (YYYY-MM-DD) incorrectly

Sto pensando che active_model_serializer debba prendere l'attributo date e convertirlo in formato iso8601.

Object.date.to_time_in_current_zone.iso8601 

C'è un modo per dire a active_model_serializers come serializzare tutti gli oggetti data? O dovrei risolvere il problema del fuso orario in javascript?

risposta

7

Questa è la mia soluzione attuale, ma credo che sia possibile definire in che modo gli oggetti di data vengono serializzati 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 

UPDATE

La mia soluzione preferita è ora quello di scimmia patchare il metodo 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

È inoltre possibile aggiungere un attributo arbitrario: 'attributi: id,: customer_id,: l'equilibrio,: ​​date' e poi basta implementare' def date' invece di fare scherzi con l'intero hash degli attributi. – awendt

1

Nell'ultima versione di ActiveSupport (4.2) Le date sono in formato iso8601. Non hai più bisogno di Monkey Patch. È possibile configurare il formato di uscita

#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