2013-12-10 11 views
5

Ich verstehe, wie respond_to funktioniert, wenn es mit so etwas wie dies heißt:Was macht respond_to, wenn ohne Block aufgerufen wird?

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

Aber ich habe einige Anwendungen gesehen, die respond_to passieren eine Liste von Symbolen, außerhalb der Controller-Methoden, zB:

class UsersController < ApplicationController 

    respond_to :html, :json 

    def index 
    # blah blah bah 
    end 
end 

Was macht das? Ich habe damit in einem meiner Controller herumgespielt und ich kann nicht herausfinden, welchen Unterschied es macht.

Antwort

2

Für eine bestimmte Controller-Aktion generiert #respond_with eine entsprechende Antwort basierend auf dem MIME-Typ, der vom Client angefordert wurde.

Wenn das Verfahren mit nur einer Ressource genannt, wie in diesem Beispiel -

class PeopleController < ApplicationController 
    respond_to :html, :xml, :json 

    def index 
    @people = Person.all 
    respond_with @people 
    end 
end 

dann die MIME-Typ der Antwort basiert in der Regel übernehmen die auf dem Request-Header ausgewählt wird und die Menge der verfügbaren Formate erklärt nach vorherigen Aufrufen der Klassenmethode read_to des Controllers. Alternativ kann der MIME-Typ ausgewählt werden, indem request.format in der Steuerung explizit gesetzt wird.

Wenn ein akzeptables Format nicht identifiziert wird, gibt die Anwendung den Status '406 - nicht akzeptabel' zurück. Andernfalls besteht die Standardantwort darin, eine Vorlage zu rendern, die nach der aktuellen Aktion und dem ausgewählten Format benannt ist, z. index.html.erb. Wenn keine Vorlage verfügbar ist, hängt das Verhalten vom ausgewählten Format ab:

für eine HTML-Antwort - wenn die Anfrage-Methode erhalten wird, wird eine Ausnahme ausgelöst, aber für andere Anfragen wie zum Beispiel die Antwort hängt davon ab, ob die Ressource hat Validierungsfehler (dh angenommen, dass versucht wurde, die Ressource zu speichern, z. B. durch eine Erstellungsaktion) -

Wenn keine Fehler vorliegen, dh die Ressource wurde erfolgreich gespeichert, leitet die Antwort die Ressource um, dh ihre show action .

Wenn Validierungsfehler auftreten, gibt die Antwort eine Standardaktion aus, dh: Neu für eine Postanforderung oder: Bearbeitung für Patch oder Put.

So ein Beispiel wie folgt aus -

respond_to :html, :xml 

def create 
    @user = User.new(params[:user]) 
    flash[:notice] = 'User was successfully created.' if @user.save 
    respond_with(@user) 
end 

entspricht, in Abwesenheit von create.html.erb, zu -

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 

für eine Javascript-Anfrage - wenn die Vorlage nicht ist gefunden, wird eine Ausnahme ausgelöst.

für andere Anforderungen - d. H. Datenformate wie xml, json, csv usw., wenn die an passant_with übergebene Ressource auf to_ antwortet, versucht die Methode, die Ressource im angeforderten Format direkt, z. Für eine XML-Anforderung entspricht die Antwort dem Aufruf von render xml: resource.

+0

Ist also 'read_to' außerhalb einer Methode bedeutungslos, wenn keine der Methoden' respond_with' aufrufen? – GMA

+1

Mit anderen Worten sollten Sie die Klassenmethode read_to in einem Paar mit der Methode "respond_with" verwenden oder die Instanzmethode "read_to" mit der Methode "block in action" verwenden. – SergeyKutsko

Verwandte Themen