Il s'agit d'un bloc de code Ruby qui tire parti d'une méthode d'aide de Rails. Si vous n'êtes pas encore familier avec les blocs, vous les verrez souvent en Ruby.
respond_to
est une méthode d'aide Rails qui est attachée à la classe Controller (ou plutôt, à sa super classe). Elle fait référence à la réponse qui sera envoyée à la vue (qui sera envoyée au navigateur).
Le bloc dans votre exemple formate les données - en passant dans un paramètre "format" dans le bloc - à envoyer du contrôleur à la vue chaque fois qu'un navigateur fait une demande de données html ou json.
Si vous êtes sur votre machine locale et que vous avez configuré votre échafaudage de poste, vous pouvez vous rendre à l'adresse suivante http://localhost:3000/posts
et vous verrez tous vos messages au format html. Mais, si vous tapez ceci : http://localhost:3000/posts.json
vous verrez alors tous vos messages dans un objet json envoyé par le serveur.
C'est très pratique pour créer des applications lourdes en javascript qui ont besoin de passer du json dans les deux sens depuis le serveur. Si vous le souhaitez, vous pouvez facilement créer une api json sur votre back-end rails, et ne passer qu'une vue - comme la vue index de votre contrôleur Post. Vous pourriez alors utiliser une bibliothèque javascript comme Jquery o Backbone (ou les deux) pour manipuler les données et créer votre propre interface. On les appelle interfaces utilisateur asynchrones et ils deviennent vraiment populaires (Gmail en est un). Ils sont très rapides et offrent à l'utilisateur final une expérience plus proche de celle d'un ordinateur de bureau sur le web. Bien entendu, il ne s'agit là que d'un des avantages du formatage de vos données.
La façon Rails 3 d'écrire ceci serait la suivante :
class PostsController < ApplicationController
# GET /posts
# GET /posts.xml
respond_to :html, :xml, :json
def index
@posts = Post.all
respond_with(@posts)
end
#
# All your other REST methods
#
end
En mettant respond_to :html, :xml, :json
en haut de la classe, vous pouvez déclarer tous les formats que vous voulez que votre contrôleur envoie à vos vues.
Ensuite, dans la méthode du contrôleur, tout ce que vous avez à faire est de répondre_avec(@quelque_objet_que_vous_avez)
Cela simplifie juste un peu plus votre code que ce que Rails génère automatiquement.
Si vous voulez en savoir plus sur les rouages de ce ...
D'après ce que j'ai compris, Rails procède à une introspection des objets afin de déterminer quel sera le format réel. La valeur de la variable 'format' est basée sur cette introspection. Rails peut faire beaucoup de choses avec un petit peu d'information. Vous seriez surpris de voir jusqu'où peut aller un simple @post ou :post.
Par exemple, si j'ai un fichier partiel _user.html.erb qui ressemble à ceci :
_user.html.erb
<li>
<%= link_to user.name, user %>
</li>
Ensuite, ce seul élément dans ma vue d'index indiquerait à Rails qu'il doit trouver le partiel "users" et itérer à travers tous les objets "users" :
index.html.erb
<ul class="users">
<%= render @users %>
</ul>
indiquerait à Rails qu'il doit trouver la partie "user" et itérer à travers tous les objets "users" :
Vous trouverez peut-être cet article de blog utile : http://archives.ryandaigle.com/articles/2009/8/6/what-s-new-in-edge-rails-cleaner-restful-controllers-w-respond_with
Vous pouvez également consulter la source : https://github.com/rails/rails
1 votes
Ce serait bien si je pouvais faire un lien vers la documentation de ActionController::MimeResponds::ClassMethods::respond_to mais api.rubyonrails.org ne semble pas aimer les hyperliens directs...
1 votes
Respond_to prend la fin de l'appel (par exemple blah.html, blah.json, etc) et correspond à la vue spécifiée. D'autres réponses peuvent être XML, CSV et bien d'autres encore, en fonction de l'application.
5 votes
Comment cela "correspond à la vue spécifiée" ?
0 votes
Je ne pense pas que l'extension (xml, html, etc.) soit liée à une vue. Si vous choisissez le rendu par défaut (
format.html
-- aucun argument), il utilisera des conventions (basées sur l'URL et le verbe HTTP) pour choisir une vue (censée être HTML). Le répondeur (format) reçoit ici l'instruction de rendre les URL se terminant par .json en les sérialisant en json, en cambio d'utiliser des vues et des conventions.