2010-03-31 34 views
5

Tôi muốn sửa đổi tên lớp khi gọi to_json trên mô hình AR.Ghi đè tên mô hình as_json hoặc to_json

ví dụ:

Book.first.to_json 
#=> "{\"book\":{\"created_at\":\"2010-03-23 

Book.first.to_json(:root => 'libro') 
#=> "{\"libro\":{\"created_at\":\"2010-03-23 

Có một tùy chọn để làm điều này?

+1

Tôi không biết về trọng to_json nhưng bạn có thể đặt ActiveRecord :: Base.include_root_in_json = false và nó sẽ không ra nút gốc, bạn có thể sau đó thêm bất kỳ nút gốc nào bạn thích. – Corey

Trả lời

0

Bạn có thể ghi đè phương thức to_json mặc định trong mô hình của mình, tạo một băm thuộc tính bạn muốn và sau đó gọi phương thức to_json của hàm băm trên đó.

class Book < ActiveRecord::Base 

    def to_json 
    { :libro => { :created_at => created_at } }.to_json 
    end 

end 

#=> "{\"libro\":{\"created_at\":\"2010-03-26T13:45:28Z\"}}" 

Hoặc nếu bạn muốn tất cả các hồ sơ thuộc tính ...

def to_json 
    { :libro => self.attributes }.to_json 
end 
28

Để tương thích với Rails 3, ghi đè as_json thay vì to_json. Nó đã được giới thiệu trong 2.3.3:

def as_json(options={}) 
    { :libro => { :created_at => created_at } } 
end 

Đảm bảo ActiveRecord::Base.include_root_in_json = false. Khi bạn gọi to_json, đằng sau hậu trường as_json được sử dụng để xây dựng cấu trúc dữ liệu và ActiveSupport::json.encode được sử dụng để mã hóa dữ liệu thành chuỗi JSON.

6

Kể từ 3.0.5, ít nhất, bạn hiện có tùy chọn chuyển một tùy chọn: root tới cuộc gọi to_json. Đây là nguồn của phương thức as_json trên bản ghi hoạt động ngay bây giờ.

def as_json(options = nil) 
    hash = serializable_hash(options) 

    if include_root_in_json 
     custom_root = options && options[:root] 
     hash = { custom_root || self.class.model_name.element => hash } 
    end 

    hash 
end 

Vì vậy, để sử dụng này chỉ @obj.to_json(:root => 'custom_obj')

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