2012-09-21 8 views
7

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

問題です。 ember-dataがjavascriptのDateコンストラクタを使用して日付をデシリアライズすると、「間違った」タイムゾーンとみなされます。

*間違っているのは最適な単語ではありませんが、現在のタイムゾーンをデフォルトにしたいので間違っています。 DS.Model date attribute parses date (YYYY-MM-DD) incorrectly

私はactive_model_serializerが日付属性をとり、iso8601形式に変換する必要があると考えています。

Object.date.to_time_in_current_zone.iso8601 

active_model_serializersにすべての日付オブジェクトをシリアル化する方法を教えてください。または、私はjavascriptでタイムゾーンの問題を修正する必要がありますか?

答えて

7

私の現在の解決策ですが、実際に日付オブジェクトがどのようにグローバルにシリアライズされるかを定義することができるはずです。

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 
+1

あなたはまた、任意の属性を追加することができ、出力形式を設定することができます属性全体がハッシュされています。 – awendt

1

ActiveSupport(4.2)の最新バージョンでは、日付はiso8601形式です。もうMonkey Patchは必要ありません。 `属性:ID:CUSTOMER_ID、:バランス、:date`その後、ちょうどいじりするのではなく、デフdate``実装あなたは

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

See the doc

関連する問題