2013-07-26 35 views
7

Tôi có một Rails Controller đáp ứng với các đối tượng JSON. Hãy lấy ví dụ lý thuyết này:Rails 4 - Tùy chỉnh định dạng (json) của các đối tượng phản hồi trong Rails

respond_to :json 
def index 
    respond_with Comment.all 
end 

này sẽ phản ứng với cái gì đó như

[{"id":1,"comment_text":"Random text ", "user_id":1 ,"created_at":"2013-07-26T15:08:01.271Z","updated_at":"2013-07-26T15:08:01.271Z"}] 

gì tôi đang tìm là một "thực hành tốt nhất" phương pháp can thiệp vào các định dạng của đối tượng json và trở lại một cái gì đó như thế này:

[{"id":1,"comment_text":"Random text ", "username": "John Doe", "user_id":1 ,"created_at":"3 hours ago"}] 

Như bạn thấy, tôi đang thêm cột không tồn tại trong "tên người dùng" mô hình cơ sở dữ liệu, tôi đang chọn "updated_at" và tôi định dạng " created_at "đến chứa văn bản có thể đọc được của con người thay vì ngày tháng.

Có ai nghĩ gì không?

+0

Tốt nhất là để JBuilder: https://github.com/rails/jbuilder Nó bao gồm trong Rails 4 theo mặc định . – germs12

Trả lời

4

2 cách:

trước tiên: xác định chế độ xem, nơi bạn tạo và trả lại băm bạn sẽ chuyển đổi thành json.

điều khiển:

YourController < ApplicationController 
    respond_to :json 

    def index 
    @comments = Comment.all 
    end 
end 

xem: index.json.erb

res = { 
    :comments => @comments.map do |x| 
    item_attrs = x.attributes 
    item_attrs["username"] = calculate_username 
    end 
} 

res.to_json.html_safe 

thứ hai: Sử dụng đá quý active_model_serializers

3

tôi muốn xác định lại phương pháp as_json của mô hình của bạn.

Trong mô hình Comment của bạn,

def username 
    "John Doe" 
end 

def time_ago 
    "3 hours ago" 
end 

def as_json(options={}) 
    super(:methods => [:username, :time_ago], except: [:created_at, :updated_at]) 
end 

Bạn không cần phải thay đổi điều khiển của bạn

Hãy xem tài liệu cho as_json

+0

sử dụng phương thức to_json và chuyển các tùy chọn bạn muốn, đơn giản và linh hoạt. Bạn có thể dễ dàng sử dụng các hành động khác nhau để chuyển các thuộc tính nhiều hơn hoặc ít hơn từ mô hình của mình. Tất cả các chi tiết đều có trong tài liệu liên kết ở trên –

12

Ghi đè as_json hoặc làm việc với quan điểm JSON ERB thể là cồng kềnh, đó là lý do tại sao tôi thích sử dụng ActiveModel Serializers (hoặc RABL):

class CommentSerializer < ActiveModel::Serializer 
    include ActionView::Helpers::DateHelper 

    attributes :id, :created_at 

    def created_at 
    time_ago_in_words(object.created_at) 
    end 

end 

Nhìn vào đây để biết thêm thông tin:

  1. https://github.com/rails-api/active_model_serializers
  2. https://github.com/nesquena/rabl
Các vấn đề liên quan