Supposons que vous soyez dans votre contrôleur d'utilisateurs et que vous souhaitiez obtenir une réponse json pour une demande d'exposition, ce serait bien si vous pouviez créer un fichier dans vos vues / utilisateurs / 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 du genre:
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 sera automatiquement rendu comme suit:
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 cette sensation horriblement sale que je ressens lorsque je rendrai mon json dans le contrôleur
format.json
avec unshow.json.erb
fichier. Voyez ma réponse.Réponses:
Vous devriez pouvoir faire quelque chose comme ça dans votre
respond_to
bloc:qui rendra le modèle au format
app/views/users/_show.json.erb
.la source
Essayez d'ajouter 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 aussi, donc votre fichier pourrait ressembler à cecila source
@user.first_name.to_json
place deescape_javascript
. Il existe des différences subtiles entre ce que JS permet et ce qui est strictement JSON. (Et ces différences deviennent importantes à mesure que les navigateurs implémentent leurs propres analyseurs JSON.)<%= xyz.to_json %>
sinon vous vous retrouverez avec des guillemets supplémentaires.Comme d'autres l'ont mentionné, vous avez besoin d'une vue users / show.json, mais il existe des options à considérer pour le langage de création de modèles ...
ERB
Fonctionne hors de la boîte. Idéal pour le HTML, mais vous trouverez rapidement que c'est affreux pour JSON.
RABL
Bonne solution. Vous devez ajouter une dépendance et apprendre son DSL.
Générateur JSON
Même accord que RABL: Bonne solution. Vous devez ajouter une dépendance et apprendre son DSL.
Rubis uni
Ruby est génial pour générer du JSON et il n'y a rien de nouveau à apprendre car vous pouvez appeler
to_json
un objet Hash ou AR. Enregistrez simplement l'extension .rb pour les modèles (dans un initialiseur):Créez ensuite la vue users / show.json.rb:
Pour plus d'informations sur cette approche, consultez http://railscasts.com/episodes/379-template-handlers
la source
RABL est probablement la meilleure solution à ce problème que j'ai vue si vous recherchez une alternative plus propre à la syntaxe ERb. json_builder et argonaut, qui sont d'autres solutions, semblent quelque peu obsolètes et ne fonctionneront pas avec Rails 3.1 sans quelques correctifs.
RABL est disponible via un gem ou consultez le référentiel GitHub; de bons exemples aussi
https://github.com/nesquena/rabl
la source
Juste pour mettre à jour cette réponse pour le bien des autres qui se retrouvent sur cette page.
Dans Rails 3, il vous suffit de créer un fichier à
views/users/show.json.erb
. L'@user
objet sera disponible pour la vue (tout comme il le serait pour le HTML.) Vous n'en avez mêmeto_json
plus besoin .Pour résumer, c'est juste
et
la source
respond_with @user, only: [:name]
. Reportez-vous à ce didacticiel pour plus d'informations.Ajoutez simplement le
show.json.erb
fichier avec le contenuParfois, cela est utile lorsque vous avez besoin de méthodes d'assistance 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 dans JSON:la source
<%= raw(@user.to_json) %>
éviter l'échappement HTML. Ce que je fais, c'est que je compte sur to_json tant qu'il me donne ce que je veux, mais quand je veux faire autre chose, je le modélise avec ce qui est habituellement un fichier{ :blah => @user.the_blah }.to_json
.C'est potentiellement une meilleure option et plus rapide que ERB: https://github.com/dewski/json_builder
la source
Im nouveau à RoR c'est ce que j'ai découvert. vous pouvez directement rendre un format json
la source