Este é um bloco de código Ruby que tira proveito de um método auxiliar do Rails. Se você ainda não conhece os blocos, os verá bastante em Ruby.
respond_to
é um método auxiliar do Rails anexado à classe Controller (ou melhor, sua superclasse). Ele está referenciando a resposta que será enviada para o View (que está indo para o navegador).
O bloco no seu exemplo está formatando dados - passando um paramater 'format' no bloco - a ser enviado do controlador para a visualização sempre que um navegador faz uma solicitação de dados html ou json.
Se você estiver em sua máquina local e tiver seu andaime Post configurado, poderá acessar http://localhost:3000/posts
e verá todas as suas postagens no formato html. Mas, se você digitar isto http://localhost:3000/posts.json
:, verá todas as suas postagens em um objeto json enviado do servidor.
Isso é muito útil para criar aplicativos pesados em javascript que precisam passar o json para frente e para trás a partir do servidor. Se você quisesse, poderia criar facilmente uma json api no seu back-end de trilhos e passar apenas uma visualização - como a visualização de índice do seu controlador Post. Em seguida, você pode usar uma biblioteca javascript como Jquery ou Backbone (ou ambos) para manipular dados e criar sua própria interface. Essas são chamadas de interfaces de usuário assíncronas e estão se tornando realmente populares (o Gmail é um). Eles são muito rápidos e proporcionam ao usuário final uma experiência mais semelhante à da área de trabalho na web. Obviamente, essa é apenas uma vantagem de formatar seus dados.
O jeito do Rails 3 de escrever isso seria o seguinte:
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
Ao colocar respond_to :html, :xml, :json
no topo da classe, você pode declarar todos os formatos que deseja que seu controlador envie para seus pontos de vista.
Em seguida, no método do controlador, tudo o que você precisa fazer é responder_com (@whatever_object_you_have)
Apenas simplifica seu código um pouco mais do que o que o Rails gera automaticamente.
Se você quer saber sobre o funcionamento interno deste ...
Pelo que entendi, o Rails introspecta os objetos para determinar qual será o formato real. O valor das variáveis 'format' é baseado nessa introspecção. O Rails pode fazer muito com um pouco de informação. Você ficaria surpreso com o quão longe um simples @post ou: post vai.
Por exemplo, se eu tivesse um arquivo parcial _user.html.erb parecido com este:
_user.html.erb
<li>
<%= link_to user.name, user %>
</li>
Então, isso sozinho na minha exibição de índice informaria ao Rails que ele precisava encontrar os 'usuários' parciais e iterar por todos os objetos 'usuários':
index.html.erb
<ul class="users">
<%= render @users %>
</ul>
permitiria ao Rails saber que precisava encontrar o 'usuário' parcial e iterar através de todos os objetos 'usuários':
Você pode achar útil este post do blog: http://archives.ryandaigle.com/articles/2009/8/6/what-s-new-in-edge-rails-cleaner-restful-controllers-w-respond_with
Você também pode ler a fonte: https://github.com/rails/rails