Per una determinata azione del controller, #respond_with genera una risposta appropriata in base al tipo mime richiesto dal client.
Se il metodo viene chiamato con solo una risorsa, come in questo esempio -
class PeopleController < ApplicationController
respond_to :html, :xml, :json
def index
@people = Person.all
respond_with @people
end
end
poi il mime-type della risposta è tipicamente selezionato in base Accept della richiesta e l'insieme di formati disponibili dichiarato con le chiamate precedenti al metodo di classe del controllore respond_to. In alternativa, è possibile selezionare il tipo mime impostando esplicitamente request.format nel controller.
Se non viene identificato un formato accettabile, l'applicazione restituisce uno stato "406 - non accettabile". In caso contrario, la risposta predefinita è il rendering di un modello chiamato dopo l'azione corrente e il formato selezionato, ad es. index.html.erb. Se nessun modello è disponibile, il comportamento dipende dal formato selezionato:
per una risposta HTML - se il metodo di richiesta viene restituito, viene sollevata un'eccezione ma per altre richieste, ad esempio posta la risposta dipende dal fatto che la risorsa abbia o meno errori di convalida (ad esempio, supponendo che sia stato fatto un tentativo di salvare la risorsa, ad esempio mediante un'azione di creazione) -
Se non ci sono errori, ovvero la risorsa è stata salvata correttamente, il reindirizzamento della risposta alla risorsa, ovvero la sua azione di visualizzazione .
Se sono presenti errori di convalida, la risposta esegue il rendering di un'azione predefinita, ovvero: nuovo per una richiesta di post o: modifica per patch o put.
Così un esempio come questo -
respond_to :html, :xml
def create
@user = User.new(params[:user])
flash[:notice] = 'User was successfully created.' if @user.save
respond_with(@user)
end
è equivalente, in assenza di create.html.erb, a -
def create
@user = User.new(params[:user])
respond_to do |format|
if @user.save
flash[:notice] = 'User was successfully created.'
format.html { redirect_to(@user) }
format.xml { render xml: @user }
else
format.html { render action: "new" }
format.xml { render xml: @user }
end
end
end
per una richiesta javascript - se il modello non è trovato, viene sollevata un'eccezione.
per altre richieste - ad esempio formati di dati come xml, json, csv ecc., Se la risorsa passata a rispondere_con risponde a to_, il metodo tenta di rendere direttamente la risorsa nel formato richiesto, ad es. per una richiesta xml, la risposta equivale a chiamare render xml: resource.
Quindi 'respond_to' al di fuori di un metodo senza significato se nessuno dei metodi chiama' respond_with'? – GMA
in altre parole, dovresti usare il metodo di classe respond_to in una coppia con metodo respond_with o usare il metodo di istanza response_to con il metodo block in action. – SergeyKutsko