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.
Ist also 'read_to' außerhalb einer Methode bedeutungslos, wenn keine der Methoden' respond_with' aufrufen? – GMA
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