Dans Rails, comment rendre un JSON en utilisant une vue?

Supposons que vous soyez dans le contrôleur de vos utilisateurs et que vous souhaitiez obtenir une réponse json pour une requête show, ce serait bien si vous pouviez créer un fichier dans vos vues / users / dir, nommé show.json et après que vos utilisateurs # montrent l’action est terminée, il rend le fichier.

Actuellement, vous devez faire quelque chose comme:

def show @user = User.find( params[:id] ) respond_to do |format| format.html format.json{ render :json => @user.to_json } end end 

Mais ce serait bien si vous pouviez simplement créer un fichier show.json qui serait automatiquement rendu comme ceci:

 def show @user = User.find( params[:id] ) respond_to do |format| format.html format.json end end 

Cela me sauverait des tonnes de chagrin, et effacerait ce sentiment horriblement sale que je ressens quand je rend mon json dans le contrôleur

Vous devriez pouvoir faire quelque chose comme ça dans votre bloc respond_to :

 respond_to do |format| format.json render :partial => "users/show.json" end 

qui rendra le modèle dans app/views/users/_show.json.erb .

Essayez d’append une vue users/show.json.erb Cela devrait être rendu lorsque vous faites une demande pour le format JSON, et vous obtenez l’avantage supplémentaire d’être rendu par erb, donc votre fichier pourrait ressembler à ceci

 { "first_name": "<%= @user.first_name.to_json %>", "last_name": "<%= @user.last_name.to_json %>" } 

Comme d’autres l’ont mentionné, vous avez besoin d’une vue users / show.json, mais il existe des options à prendre en compte pour le langage de template …

ERB

Fonctionne hors de la boîte. Idéal pour HTML, mais vous trouverez rapidement que c’est terrible pour JSON.

RABL

Bonne solution. Devoir append une dépendance et apprendre son DSL.

JSON Builder

Même accord que RABL: Bonne solution. Devoir append une dépendance et apprendre son DSL.

Ruby Plain

Ruby est génial à générer JSON et il n’y a rien de nouveau à apprendre car vous pouvez appeler to_json sur un object Hash ou AR. Enregistrez simplement l’extension .rb pour les templates (dans un initialiseur):

 ActionView::Template.register_template_handler(:rb, :source.to_proc) 

Ensuite, créez la vue users / show.json.rb:

 @user.to_json 

Pour plus d’informations sur cette approche, voir http://railscasts.com/episodes/379-template-handlers

RABL est probablement la meilleure solution à ce problème, si vous recherchez une alternative plus propre à la syntaxe ERb. json_builder et argonaut, qui sont d’autres solutions, semblent un peu obsolètes et ne fonctionneront pas avec Rails 3.1 sans quelques corrections.

RABL est disponible via un bijou ou consultez le repository GitHub; bons exemples aussi

https://github.com/nesquena/rabl

Juste pour mettre à jour cette réponse dans l’intérêt des autres qui se retrouvent sur cette page.

Dans Rails 3, il vous suffit de créer un fichier dans views/users/show.json.erb . L’object @user sera disponible pour la vue (comme pour le HTML). Vous n’avez même plus besoin de to_json .

Pour résumer, c’est juste

 # users contoller def show @user = User.find( params[:id] ) respond_to do |format| format.html format.json end end 

et

 /* views/users/show.json.erb */ { "name" : "<%= @user.name %>" } 

Il suffit d’append le fichier show.json.erb avec le contenu

 <%= @user.to_json %> 

Parfois, cela est utile lorsque vous avez besoin de méthodes d’assistance supplémentaires qui ne sont pas disponibles dans le contrôleur, à savoir image_path(@user.avatar) ou quelque chose pour générer des propriétés supplémentaires dans JSON:

 <%= @user.attributes.merge(:avatar => image_path(@user.avatar)).to_json %> 

C’est potentiellement une meilleure option et plus rapide qu’ERB: https://github.com/dewski/json_builder