2012-04-26 29 views
10

Tôi đang gặp sự cố khi tôi đang làm việc với phương pháp as_json và cách trả lại hiệu quả đối tượng trong JSON AND nó cũng thuộc đối tượng dưới dạng JSON, trong đó đối tượng depends_to có đối tượng is_to riêng. Mã có lẽ sẽ giải thích nó tốt hơn.Rails as_json issue - Cách bao gồm các đối tượng lồng nhau hiệu quả?

Các Not-Working Way

Alert lớp

class Alert < ActiveRecord::Base 
    belongs_to :message 
    # for json rendering 
    def as_json(options={}) 
     super(:include => :message) 
    end 
end 

nhắn lớp

def as_json(options={}) 
    super(methods: [:timestamp, :num_photos, :first_photo_url, :tag_names], 
      include: { camera: { only: [:id, :name] }, 
         position: { only: [:id, :name, :address, :default_threat_level ]}, 
         images: { only: [:id, :photo_url, :is_hidden]} }) 
    end 

Vấn đề này lần đầu tiên được thành lập là khi tôi có một đối tượng Alert và gọi

alert.as_json() 

tôi nhận được tất cả các thuộc tính từ Alert và tất cả các thuộc tính từ tin nhắn, nhưng không ai trong số các thuộc tính khác từ tin nhắn mà tôi muốn, như Camera, Chức vụ, vv

Đây là "Đó là làm việc, nhưng có lẽ không đúng thiết kế Way"

Alert Lớp

class Alert < ActiveRecord::Base 

    belongs_to :message 

    # for json rendering 
    def as_json(options={}) 
     super().merge(:message => message.as_json) 
    end 
end 

Tin nhắn Lớp

# for json rendering 
    def as_json(options={}) 
    super(methods: [:timestamp, :num_photos, :first_photo_url, :tag_names]) 
      .merge(:camera => camera.as_json) 
      .merge(:position => position.as_json) 
      .merge(:images => images.as_json) 
    end 

Trong thiết lập thứ 2 này, tôi nhận được tất cả thuộc tính lồng nhau của Tin nhắn như tôi muốn.

Câu hỏi của tôi, tôi có bỏ lỡ một số Công ước Rails để làm điều này đúng không? Nó có vẻ như sẽ có/nên là một cách dễ dàng hơn.

Trả lời

3

Bạn đang sử dụng phiên bản Rails nào? Đây là lỗi đã biết trong các phiên bản cũ của Rails, được cho là đã được sửa với this pull request. Cú pháp của bạn có vẻ đúng với tôi, vì vậy có lẽ đây là vấn đề của bạn?

Ngoài ra, bạn cũng có thể muốn thanh toán active_model_serializers mới từ Jose Valim (thành viên cốt lõi của Rails). Nó ít nhất có thể cho phép bạn làm việc xung quanh vấn đề của bạn một cách thanh lịch hơn.

+0

Có vẻ như họ đã sửa nó bằng yêu cầu kéo, nhưng không bao giờ kéo nó vào một phiên bản.Cảm ơn bạn đã liên kết, nó đã xóa một vài vấn đề. – bluedevil2k

+1

Đối với hồ sơ, những gì tôi nhận được từ PR đó là: 1) cố gắng sử dụng một viên ngọc cụ thể cho json json (Tôi thích Active Model Serializers) 2) Nếu bạn không muốn/không thể làm điều đó, ghi đè lên 'serialized_hash 'thay vì' as_json' trong tất cả các mô hình của bạn. Chỉ cần thay thế 'as_json' bằng' serialized_hash'. Mô hình của bạn sẽ hiển thị chính xác các phụ thuộc được bao gồm. – kikito

+0

cảm ơn kikito, chỉnh sửa nhỏ, đó là 'serializable_hash' – trans1t

1

Tôi khuyên bạn nên xem RABL (viết tắt của Ruby API Builder Language) gem (railscast, github). Nó cung cấp cho bạn một DSL để xác định cấu trúc của JSON (và cả XML) của bạn trong các mẫu (như Haml hoặc CoffeeScript). Nó cũng hỗ trợ partials.

7

Câu trả lời hay nhất cho tôi là sử dụng serializable_hash. @kikito chạm vào điều này trong bình luận của mình, nhưng có một lỗi đánh máy đã ngăn nó hoạt động. Nó không phải là , nó là serializable_hash.

Nghĩa đen chỉ tìm thấy + thay thế as_json bằng serializable_hash và lỗi này biến mất. (Nó vẫn chưa được sửa trong Rails 4.0.2). Bạn cũng có được lợi ích của việc có một thời gian dễ dàng hơn khi triển khai một API XML sau (một số người vẫn sử dụng chúng).

+1

cảm ơn, đã làm việc cho tôi – toby

Các vấn đề liên quan