8

私はactive_model_serializersとember.jsを使用しています。私のモデルの 1 つに日付属性があります。Rails では、日付属性は「YYYY-MM-DD」の形式でシリアル化されます。

問題; ember-data が javascript Date コンストラクターを使用して日付を逆シリアル化すると、「正しくない」タイムゾーンと見なされます。

*間違っているというのは適切な言葉ではありませんが、現在のタイムゾーンをデフォルトにしたいので間違っています。DS.Model の日付属性が日付 (YYYY-MM-DD) を正しく解析しない

私は、active_model_serializer が日付属性を取り、それを 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 形式になっています。もうモンキーパッチは必要ありません。出力形式を設定できます

#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 に答える