8

我正在使用 active_model_serializers 和 ember.js。我的一个模型有一个日期属性。在 Rails 中,日期属性以“YYYY-MM-DD”的格式序列化。

问题; 当 ember-data 使用 javascript Date 构造函数反序列化日期时,它假定一个“不正确的”时区。

*不正确不是最好的词,但它是不正确的,因为我希望它默认为当前时区。DS.Model 日期属性解析日期 (YYYY-MM-DD) 不正确

我认为 active_model_serializer 应该采用 date 属性并将其转换为 iso8601 格式。

 Object.date.to_time_in_current_zone.iso8601

有没有办法告诉 active_model_serializers 如何序列化所有日期对象?还是我应该在 javascript 中修复时区问题?

4

2 回答 2

8

这是我当前的解决方案,但我真的觉得应该可以定义日期对象如何全局序列化。

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
于 2012-09-21T21:32:00.747 回答
3

在 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

查看文档

于 2015-02-12T08:57:58.100 回答