Il s'agit d'un bloc de code Ruby qui tire parti d'une méthode d'assistance Rails. Si vous n'êtes pas encore familier avec les blocs, vous les verrez beaucoup dans Ruby.
respond_to
est une méthode d'assistance Rails attachée à la classe Controller (ou plutôt à sa super classe). Il fait référence à la réponse qui sera envoyée à la vue (qui va au navigateur).
Le bloc dans votre exemple est le formatage des données - en passant 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 ordinateur local et que votre échafaudage Post est configuré, vous pouvez aller à http://localhost:3000/posts
et vous verrez tous vos messages au format html. Mais, si vous tapez ceci:, http://localhost:3000/posts.json
alors vous verrez tous vos messages dans un objet json envoyé par le serveur.
C'est très pratique pour créer des applications lourdes javascript qui doivent passer json dans les deux sens depuis le serveur. Si vous le souhaitez, vous pouvez facilement créer une API json sur le back-end de vos rails et ne transmettre qu'une seule vue, comme la vue d'index de votre contrôleur Post. Ensuite, vous pouvez utiliser une bibliothèque javascript comme Jquery ou Backbone (ou les deux) pour manipuler les données et créer votre propre interface. On les appelle des interfaces utilisateur asynchrones et elles deviennent très populaires (Gmail en est un). Ils sont très rapides et offrent à l'utilisateur final une expérience plus semblable à celle d'un ordinateur de bureau sur le Web. Bien sûr, ce n'est qu'un avantage du formatage de vos données.
La façon d'écrire ceci de Rails 3 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 plaçant respond_to :html, :xml, :json
en haut de la classe, vous pouvez déclarer tous les formats que vous souhaitez 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 (@wthing_object_you_have)
Il simplifie simplement votre code un peu plus que ce que Rails génère automatiquement.
Si vous voulez en savoir plus sur le fonctionnement interne de cette ...
D'après ce que je comprends, Rails introspecte les objets pour déterminer quel sera le format réel. La valeur des variables «format» est basée sur cette introspection. Les rails peuvent faire beaucoup de choses avec un peu d'informations. Vous seriez surpris de voir jusqu'où irait un simple @post ou: post.
Par exemple, si j'avais un fichier partiel _user.html.erb qui ressemblait à ceci:
_user.html.erb
<li>
<%= link_to user.name, user %>
</li>
Ensuite, cela seul dans ma vue d'index permettrait à Rails de savoir qu'il devait trouver le partiel "utilisateurs" et parcourir tous les objets "utilisateurs":
index.html.erb
<ul class="users">
<%= render @users %>
</ul>
permettrait à Rails de savoir qu'il avait besoin de trouver le partiel «utilisateur» et de parcourir tous les objets «utilisateurs»:
Vous pouvez trouver 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