2011-01-19 5 views
2

J'ai une collection de @clients avec des attributs id et email Je veux rendre ce format JSONrails 3 JSON de mise en forme JSON personnalisé

[ 
{"id":" 1","label":"[email protected]","value":"1"},{"id":" 2","label":"[email protected]","value":"2"} 
] 

dans clients_controller I défini la méthode suivante

def search 
    @clients = Client.where(:user_id => current_user.id).select('id','email') 
    render :partial => "clients/search" 
    end 

et voici la vue _search.json.erb

[ 
<%= raw @client.map{|client| '{"id":"' +" #{client.id}" +'","label":"' + "#{client.email}" + '","value":"' +"#{client.id}" +'"}' }.join(",") %> 
] 

cela fonctionne, mais je trouvé fugly ... y at-il une façon plus élégante de générer un format json personnalisé dans une vue?

Répondre

6

Vous avez juste besoin d'utiliser la méthode to_json. En vous cas, il est

@client.to_json(:only => [:id, :label, :value]) 
+0

ce n'est pas le format de sortie personnalisé dont j'ai besoin. J'ai clarifié ma question, d'autres idées? – Alpha

+0

'@ client.to_json (...)' sort le standard json. Pouvez-vous clarifier ce que vous entendez par * custom *? Si vous voulez changer l'espace, les nouvelles lignes, etc., alors votre solution est correcte. Cependant, vous ne devriez pas avoir besoin de faire une sortie personnalisée pour json sinon vous ne parlez pas de json normalisé. – Sukima

7

Utilisez une fonction d'assistance que vous appelez de la vue de formater la sortie ou une fonction de bibliothèque que vous appelez du contrôleur. Exemple (de suite):

def search 
    @clients = Client.where(:user_id => current_user.id).select('id','email') 
    respond_to do |format| 
    format.html 
    format.json do 
     render :json => custom_json_for(@clients) 
    end 
    end 
end 

private 
def custom_json_for(value) 
    list = value.map do |client| 
    { :id => " #{client.id}", 
     :label => client.email.to_s, 
     :value => client.id.to_s 
    } 
    end 
    list.to_json 
end 
+0

Pour une solution plus découplée et évolutive, consultez [Modèles RABL] (https://github.com/ccocchi/rabl-rails). – Sukima

0

Vous pouvez utiliser https://github.com/dewski/json_builder/ pour personnaliser votre réponse JSON dans la vue et le séparer du contrôleur. Il est bon quand vous avez besoin d'ajouter un peu de "utilisateur actuel" attributs en fonction comme

[{:attending => event.attending?(current_user)}] 
1

Vous pouvez utiliser jBuilder petit bijou de GitHub

pour clients_controller

def search 
    @clients = Client.where(:user_id => current_user.id) 
end 

et search.json.jbuilder

json.id @clients.id 
json.label @clients.email 
json.value @clients.id 

Pour plus d'informations, vous pouvez visiter Jbuilder on RailsCast