Supposons que vous soyez dans votre contrôleur d’utilisateurs et que vous souhaitiez obtenir une réponse json pour une demande d’émission. Ce serait bien si vous pouviez créer un fichier dans votre dossier views/users/dir, nommé show.json et après vos utilisateurs # show l'action est terminée, il restitue le fichier.
Actuellement, vous devez faire quelque chose dans le sens de:
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 créer un fichier show.json qui sera automatiquement rendu comme suit:
def show
@user = User.find( params[:id] )
respond_to do |format|
format.html
format.json
end
end
Cela me ferait économiser des tonnes de chagrin et effacerait ce sentiment horriblement sale que je ressens lorsque je rends mon JSON dans le contrôleur
Vous devriez pouvoir faire quelque chose comme ça dans votre respond_to
bloquer:
respond_to do |format|
format.json
render :partial => "users/show.json"
end
qui rendra le template en app/views/users/_show.json.erb
.
Essayez d'ajouter une vue users/show.json.erb
Cela doit être rendu lorsque vous faites une demande pour le format JSON, et vous obtenez également l'avantage de son rendu par erb, afin que votre fichier puisse 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 modélisation ...
[~ # ~] erb [~ # ~]
Fonctionne hors de la boîte. Idéal pour HTML, mais vous constaterez rapidement que c'est affreux pour JSON.
Bonne solution. Il faut ajouter une dépendance et apprendre son DSL.
Même affaire que RABL: bonne solution. Il faut ajouter une dépendance et apprendre son DSL.
Plain Ruby
Ruby est génial pour générer du JSON et il n’ya rien de nouveau à apprendre car vous pouvez appeler to_json
sur un hachage ou un objet AR. Enregistrez simplement l’extension .rb pour les modèles (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 solution la plus intéressante que j'ai trouvée si vous recherchez une alternative plus propre à la syntaxe ERb. json_builder et argonaut, qui sont d’autres solutions, semblent tous deux un peu dépassés et ne fonctionneront pas avec Rails 3.1 sans correctifs.
RABL est disponible via un bijou ou consultez le référentiel GitHub; bons exemples aussi
Juste pour mettre à jour cette réponse pour le bien des autres qui finissent par se retrouver sur cette page.
Dans Rails 3, il vous suffit de créer un fichier à views/users/show.json.erb
. L’objet @user
Sera disponible pour la vue (comme c’est le cas pour 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 %>"
}
Ajoutez simplement le fichier show.json.erb
Avec le contenu
<%= @user.to_json %>
Parfois, il est utile lorsque vous avez besoin de méthodes auxiliaires supplémentaires qui ne sont pas disponibles dans le contrôleur, c'est-à-dire image_path(@user.avatar)
ou quelque chose pour générer des propriétés supplémentaires en JSON:
<%= @user.attributes.merge(:avatar => image_path(@user.avatar)).to_json %>
C'est potentiellement une meilleure option et plus rapide que ERB: https://github.com/dewski/json_builder
Je suis nouveau sur RoR, c'est ce que j'ai découvert. vous pouvez directement rendre un format json
def YOUR_METHOD_HERE
users = User.all
render json: {allUsers: users} # ! rendering all users
END