2013-07-26 13 views
7

Ho un controller Rails che risponde con oggetti JSON. Prendiamo questo esempio teorico:Rails 4 - Personalizzazione del formato (json) degli oggetti risposta in Rails

respond_to :json 
def index 
    respond_with Comment.all 
end 

Questo avrebbe risposto con qualcosa di simile

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

Quello che sto cercando è un metodo di "best practice" per interferire con la formattazione dell'oggetto JSON e ritorno qualcosa di simile:

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

come potete vedere, io sono l'aggiunta di una colonna che non esiste nel modello di database "username", mi sto prendendo fuori "updated_at", e sto formattazione " created_at "to contengono testo leggibile dall'uomo anziché una data.

Qualche idea a qualcuno?

+0

La cosa migliore è quello di JBuilder: https://github.com/rails/jbuilder E 'incluso in Rails 4 per default . – germs12

risposta

4

2 modi:

prima: definire una vista, dove si costruisce e restituisce un hash che si converte a JSON.

regolatore:

YourController < ApplicationController 
    respond_to :json 

    def index 
    @comments = Comment.all 
    end 
end 

vista: index.json.erb

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

res.to_json.html_safe 

Secondo: l'uso gemma active_model_serializers

3

avrei ridefinire il metodo del modello as_json.

nel modello commento,

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 

Non è necessario cambiare il controller

Date un'occhiata alla documentazione per as_json

+0

usa il metodo to_json e passa le opzioni che vuoi, semplice facile e flessibile. Puoi facilmente utilizzare diverse azioni per passare più o meno attributi dal tuo modello. Tutti i dettagli sono nella documentazione collegata a sopra –