2013-07-26 22 views
7

Mam kontroler Railsów, który odpowiada obiektami JSON. Weźmy ten przykład teoretyczny:Szyny 4 - Dostosowywanie (json) formatu obiektów odpowiedzi w Railsach

respond_to :json 
def index 
    respond_with Comment.all 
end 

To reagowania z czymś jak

[{"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"}] 

Co szukam jest „najlepsze praktyki” sposób kolidować z formatowania obiektu json i powrotu coś takiego:

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

jak widać, jestem dodając kolumnę, która nie istnieje w bazie danych model „username”, biorę się „updated_at”, a ja formatowania " created_at "to zawierają tekst czytelny dla człowieka, a nie datę.

Czy masz jakieś myśli?

+0

Najprościej jest JBuildera: https://github.com/rails/jbuilder Jest to zawarte w Rails domyślnie 4 . – germs12

Odpowiedz

4

2 sposoby:

pierwszy: zdefiniować widok, gdzie budować i zwracają hash, że będziesz przekonwertować do formatu JSON.

kontroler:

YourController < ApplicationController 
    respond_to :json 

    def index 
    @comments = Comment.all 
    end 
end 

widok: index.json.erb

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

res.to_json.html_safe 

sekundę: użycie gem active_model_serializers

3

bym przedefiniować metodę modelu as_json.

w komentarzu modelu

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 

Nie trzeba zmienić kontroler

Spójrz na dokumentacji dla as_json

+0

użyj metody to_json i podaj wymagane opcje, proste łatwe i elastyczne. Możesz łatwo użyć różnych akcji, aby przekazać więcej lub mniej atrybutów z twojego modelu. Wszystkie szczegóły znajdują się w dokumentacji powiązanej z powyższym –

12

Zastępowanie as_json lub pracy z widokami JSON ERB możliwe być uciążliwym, dlatego wolę używać Active Serializers ActiveModel (lub 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 

Spójrz tutaj, aby uzyskać więcej informacji:

  1. https://github.com/rails-api/active_model_serializers
  2. https://github.com/nesquena/rabl