Questo è un blocco di codice Ruby che sfrutta un metodo di supporto Rails. Se non hai ancora familiarità con i blocchi, li vedrai molto in Ruby.
respond_to
è un metodo di supporto Rails che è collegato alla classe Controller (o meglio, la sua super classe). Fa riferimento alla risposta che verrà inviata alla vista (che sta andando al browser).
Il blocco nell'esempio è la formattazione dei dati - passando in un parametro "formato" nel blocco - da inviare dal controller alla vista ogni volta che un browser effettua una richiesta di dati html o json.
Se sei sul tuo computer locale e hai il tuo scaffold Post impostato, puoi andare a http://localhost:3000/posts
e vedrai tutti i tuoi post in formato html. Ma se digiti questo: http://localhost:3000/posts.json
, vedrai tutti i tuoi messaggi in un oggetto json inviato dal server.
Questo è molto utile per creare applicazioni javascript pesanti che devono passare json avanti e indietro dal server. Se lo si desidera, è possibile creare facilmente un json api sul binario back-end e passare solo una vista, ad esempio la vista indice del post controller. Quindi è possibile utilizzare una libreria javascript come Jquery o Backbone (o entrambi) per manipolare i dati e creare la propria interfaccia. Queste sono chiamate UI asincrone e stanno diventando molto popolari (Gmail è uno). Sono molto veloci e danno all'utente finale un'esperienza sul desktop più simile a quella del desktop. Naturalmente, questo è solo uno dei vantaggi della formattazione dei dati.
Il modo Rails 3 di scrivere questo sarebbe questo:
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
Mettendo respond_to :html, :xml, :json
al vertice della classe, è possibile dichiarare tutti i formati che si desidera che il controller per inviare le vostre opinioni.
Poi, nel metodo di controllo, tutto quello che dovete fare è respond_with (@whatever_object_you_have)
'solo semplifica il codice un po' più di quello che Rails genera automaticamente.
Se desidera conoscere il funzionamento interno di questo ...
Da quello che ho capito, Rails introspetta gli oggetti per determinare quali il formato attuale sta per essere. Il valore delle variabili 'format' si basa su questa introspezione. Rails può fare molto con un po 'di informazioni. Saresti sorpreso di quanto lontano un semplice post o: post andrà.
Per esempio, se ho avuto un file parziale _user.html.erb che si presentava così:
_user.html.erb
<li>
<%= link_to user.name, user %>
</li>
Poi, solo questo a mio avviso indice avrebbe lasciato Rails sapere che aveva bisogno di trovare parziale gli 'utenti' e scorrere tutti gli oggetti dei degli utenti ':
index.html .erb
<ul class="users">
<%= render @users %>
</ul>
avrebbe lasciato Rails sapere che aveva bisogno di trovare la 'user' parziale e scorrere tutti gli oggetti dei degli utenti ':
Potete trovare questo post utile: http://archives.ryandaigle.com/articles/2009/8/6/what-s-new-in-edge-rails-cleaner-restful-controllers-w-respond_with
È possibile anche sfogliare la fonte: https://github.com/rails/rails
Sarebbe bello se potessi collegare alla documentazione di ActionController :: MimeResponds :: ClassMethods :: respond_to ma api.rubyonrails.org non sembra gradire collegamenti ipertestuali diretti ... – Cole
respond_to prende la fine della chiamata (es. blah.html, blah.json, ecc.) e corrisponde alla vista specificata. Altre risposte possono essere XML, CSV e molte altre in base all'applicazione. – ScottJShea
In che modo "corrisponde alla vista specificata?" – Cole