2013-12-10 9 views
5

Capisco come respond_to funziona quando si chiama con qualcosa di simile:Cosa deve fare respond_to quando viene chiamato senza blocco?

def index 
    @users = User.all 
    respond_to do |format| 
    format.html 
    format.json { render json: @users } 
    end 
end 

ma ho visto alcune applicazioni che passano respond_to un elenco di simboli, al di fuori dei metodi del controller, ad esempio:

class UsersController < ApplicationController 

    respond_to :html, :json 

    def index 
    # blah blah bah 
    end 
end 

Cosa fa? Ho giocato con esso in uno dei miei controller e non riesco a capire che differenza fa.

risposta

2

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.

+0

Quindi 'respond_to' al di fuori di un metodo senza significato se nessuno dei metodi chiama' respond_with'? – GMA

+1

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

Problemi correlati