2012-09-21 8 views
7

Używam aktywnych_model_serializers i ember.js. Jeden z moich modeli ma atrybut daty. W szynach atrybuty daty są serializowane w formacie "RRRR-MM-DD".serializacji atrybutów daty

Problem; gdy ember-data rozszyfrowuje datę przy użyciu konstruktora daty javascript, przyjmuje "niepoprawną" strefę czasową.

* Niepoprawnie nie jest najlepszym słowem, ale jest niepoprawne, ponieważ chcę ustawić domyślną strefę czasową. DS.Model date attribute parses date (YYYY-MM-DD) incorrectly

Myślę, że active_model_serializer powinien przyjąć atrybut date i przekonwertować go do formatu iso8601.

Object.date.to_time_in_current_zone.iso8601 

Czy istnieje sposób, aby powiedzieć active_model_serializers, jak serializować wszystkie obiekty daty? A może powinienem rozwiązać problem strefy czasowej w javascript?

Odpowiedz

7

Oto moje obecne rozwiązanie, ale naprawdę uważam, że powinno być możliwe określenie, w jaki sposób obiekty daty są seryjnie globalizowane.

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

My Korzystny roztwór jest teraz małpy patch sposób 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

Można także dodać dowolny atrybut: 'atrybuty: id,: customer_id, balance, dzień spełnienia wymogu: a potem po prostu wdrożyć' def dzień spełnienia wymogu zamiast brudząc z całym hashem atrybutów. – awendt

1

W ostatniej wersji ActiveSupport (4.2) Daty są w formacie iso8601. Nie potrzebujesz już Małpiej Łatki. Można skonfigurować format wyjściowy

#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