连载日期属性(serialize date attributes)

2019-09-22 17:47发布

我使用active_model_serializers和ember.js。 我的一个模型都有一个日期属性。 在轨日期属性连载中的“YYYY-MM-DD”的格式。

问题; 当烬数据解串使用JavaScript日期构造它假定一个“不正确”时区的日期。

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

我想到的是active_model_serializer应采取日期属性并将其转换为ISO8601格式。

 Object.date.to_time_in_current_zone.iso8601

有没有办法告诉active_model_serializers如何序列所有日期的对象? 或者我应该被固定在JavaScript中的时区问题?

Answer 1:

这是我目前的解决方案,但我真的觉得应该可以定义如何Date对象获得全球序列化。

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

我首选的方案现在是猴子修补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


Answer 2:

在的ActiveSupport的最后一个版本(4.2)日期是在ISO8601格式。 你不需要再猴补丁。 您可配置输出格式

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

看到该文档



文章来源: serialize date attributes