2012-09-21 39 views
7

Tôi đang sử dụng active_model_serializers và ember.js. Một trong các mô hình của tôi có thuộc tính ngày. Trong các thuộc tính ngày đường ray được tuần tự hóa theo định dạng "YYYY-MM-DD".thuộc tính ngày tuần tự hóa

Sự cố; khi ember-data de-serializes ngày bằng cách sử dụng javascript constructor Date nó giả định một "không chính xác" múi giờ.

* Sai không phải là từ tốt nhất nhưng nó không chính xác vì tôi muốn nó mặc định theo múi giờ hiện tại. DS.Model date attribute parses date (YYYY-MM-DD) incorrectly

Tôi nghĩ active_model_serializer sẽ lấy thuộc tính ngày và chuyển đổi nó thành định dạng iso8601.

Object.date.to_time_in_current_zone.iso8601 

Có cách nào để thông báo cho active_model_serializers cách sắp xếp tất cả các đối tượng ngày? Hoặc tôi nên sửa chữa vấn đề múi giờ trong javascript?

Trả lời

7

Đây là giải pháp hiện tại của tôi nhưng tôi thực sự cảm thấy có thể xác định cách các đối tượng ngày được đăng trên toàn cầu.

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 

CẬP NHẬT

giải pháp ưa thích của tôi bây giờ là khỉ vá các phương pháp 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

Bạn cũng có thể thêm một thuộc tính tùy ý: 'thuộc tính: id,: customer_id: Số dư,: date' và sau đó chỉ cần thực hiện 'def date' thay vì làm rối tung với toàn bộ hàm băm. – awendt

1

Trong phiên bản mới nhất của ActiveSupport (4.2) Ngày dưới định dạng iso8601. Bạn không cần nữa Khỉ Patch. Bạn có thể cấu hình các định dạng đầu ra

#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