сериализиране на атрибути за дата

Използвам active_model_serializers и ember.js. Един от моите модели има атрибут за дата. В rails атрибутите за дата се сериализират във формат "ГГГГ-ММ-ДД".

Проблемът; когато ember-data десериализира датата с помощта на конструктора на javascript Date, той приема "неправилна" часова зона.

*Неправилно не е най-добрата дума, но е неправилна, защото искам по подразбиране да се използва текущата часова зона. Атрибутът за дата DS.Model анализира датата (ГГГГ-ММ- DD) неправилно

Мисля, че active_model_serializer трябва да вземе атрибута дата и да го преобразува във формат iso8601.

 Object.date.to_time_in_current_zone.iso8601

Има ли начин да кажете на active_model_serializers как да сериализирате всички обекти за дата? Или трябва да коригирам проблема с часовата зона в javascript?


person Aaron Renoir    schedule 21.09.2012    source източник


Отговори (2)


Ето моето текущо решение, но наистина смятам, че трябва да е възможно да се определи как обектите за дата се сериализират глобално.

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

АКТУАЛИЗИРАНЕ

Предпочитаното от мен решение сега е да закърпя метода 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
person Aaron Renoir    schedule 21.09.2012
comment
Можете също така да добавите произволен атрибут: attributes :id, :customer_id, :balance, :date и след това просто да приложите def date, вместо да се забърквате с целия хеш на атрибутите. - person awendt; 18.02.2014

В последната версия на ActiveSupport (4.2) датите са във формат iso8601. Нямате повече нужда от Monkey Patch. Можете да конфигурирате изходния формат

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

Вижте документа

person Joel AZEMAR    schedule 12.02.2015