Este es un bloque de código Ruby que aprovecha el método auxiliar de Rails. Si aún no estás familiarizado con los bloques, los verás mucho en Ruby.
respond_to
es un método auxiliar de Rails que se adjunta a la clase Controller (o mejor dicho, su superclase). Hace referencia a la respuesta que se enviará a la Vista (que se dirige al navegador).
El bloque en su ejemplo está formateando datos, pasando un parámetro de 'formato' en el bloque, para ser enviados desde el controlador a la vista cada vez que un navegador solicita datos html o json.
Si está en su máquina local y tiene configurado el andamio Post, puede ir a http://localhost:3000/posts
y verá todas sus publicaciones en formato html. Pero, si escribe esto:, http://localhost:3000/posts.json
verá todas sus publicaciones en un objeto json enviado desde el servidor.
Esto es muy útil para hacer aplicaciones pesadas de JavaScript que necesiten pasar json de un lado a otro desde el servidor. Si lo desea, puede crear fácilmente una API json en el back-end de sus rieles y solo pasar una vista, como la vista de índice de su controlador Post. Luego, podría usar una biblioteca de JavaScript como Jquery o Backbone (o ambas) para manipular datos y crear su propia interfaz. Estos se llaman IU asíncronas y se están volviendo muy populares (Gmail es uno). Son muy rápidos y le dan al usuario final una experiencia más similar a la de un escritorio en la web. Por supuesto, esta es solo una ventaja de formatear sus datos.
La forma de escribir Rails 3 sería:
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
Al colocarse respond_to :html, :xml, :json
en la parte superior de la clase, puede declarar todos los formatos que desea que su controlador envíe a sus vistas.
Luego, en el método del controlador, todo lo que tiene que hacer es responder_con (@whatever_object_you_have)
Simplemente simplifica su código un poco más de lo que Rails genera automáticamente.
Si quieres saber sobre el funcionamiento interno de esto ...
Por lo que entiendo, Rails introspectiva los objetos para determinar cuál será el formato real. El valor de las variables 'formato' se basa en esta introspección. Los rieles pueden hacer mucho con un poco de información. Te sorprendería hasta dónde llegará un simple @post o: post.
Por ejemplo, si tuviera un archivo parcial _user.html.erb con el siguiente aspecto:
_user.html.erb
<li>
<%= link_to user.name, user %>
</li>
Entonces, esto solo en mi vista de índice le permitiría a Rails saber que necesitaba encontrar los 'usuarios' parciales e iterar a través de todos los objetos de 'usuarios':
index.html.erb
<ul class="users">
<%= render @users %>
</ul>
le haría saber a Rails que necesitaba encontrar el 'usuario' parcial e iterar a través de todos los objetos 'usuarios':
Puede encontrar útil esta publicación de blog: http://archives.ryandaigle.com/articles/2009/8/6/what-s-new-in-edge-rails-cleaner-restful-controllers-w-respond_with
También puede leer detenidamente la fuente: https://github.com/rails/rails