web-dev-qa-db-fra.com

Dans Rails, comment rendez-vous le code JSON à l'aide d'une vue?

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

123
Matthew

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.

63
Alex Reisner

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 %>"
}
55
erik

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.

RABL

Bonne solution. Il faut ajouter une dépendance et apprendre son DSL.

JSON Builder

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

31
tybro0103

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

https://github.com/nesquena/rabl

27
zapnap

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 %>"
}
21
James Lim

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 %>
10
Priit

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

6
PETER BROWN

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
0
aRtoo