сериализовать атрибуты даты

Я использую active_model_serializers и ember.js. Одна из моих моделей имеет атрибут даты. В рельсах атрибуты даты сериализуются в формате «ГГГГ-ММ-ДД».

Проблема; когда ember-data десериализует дату с помощью конструктора даты javascript, он предполагает «неправильный» часовой пояс.

* Неверно - не лучшее слово, но оно неверно, потому что я хочу, чтобы по умолчанию использовался текущий часовой пояс. Атрибут даты DS.Model анализирует дату (ГГГГ-ММ- ДД) неправильно

Я думаю, что 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