Ich bin verwirrt über die Hauptunterschiede zwischen link_to
, redirect_to
und render
in Rails. Jeder kann das bitte erklären.
link_to wird in Ihrer Ansicht verwendet und generiert HTML-Code für einen Link
<%= link_to "Google", "http://google.com" %>
Dadurch wird in Ihrer Ansicht das folgende HTML erzeugt
<a href="http://google.com">Google</a>
redirect_to und render werden in Ihrem Controller verwendet, um auf eine Anfrage zu antworten. redirect_to leitet die Anfrage einfach auf eine neue URL um, wenn Sie in Ihrem Controller hinzufügen
redirect_to "http://google.com"
jeder, der auf Ihre Seite zugreift, wird effektiv an Google weitergeleitet
das Rendern kann auf viele Arten verwendet werden, wird jedoch hauptsächlich zum Rendern Ihrer HTML-Ansichten verwendet.
render "article/show"
Dadurch wird die Ansicht "app/views/article/show.html.erb" gerendert.
Der folgende Link erklärt ausführlich die Weiterleitung und die Render-Methoden http://guides.rubyonrails.org/layouts_and_rendering.html
Aus der Dokumentation :
In Bezug auf das Rendern einer Ansicht im Vergleich zur Umleitung einer Anforderung
... render teilt Rails mit, welche Ansicht (oder ein anderes Asset) zur Erstellung einer Antwort verwendet werden soll. Die Methode redirect_to führt etwas anderes aus: sie weist den Browser an, eine neue Anfrage für eine andere URL zu senden.
In Bezug auf das Rendern einer Ansicht
... render: action führt in der Zielaktion keinen Code aus...}
Umleitung einer Anfrage
... Ihr Code wird nicht mehr ausgeführt und wartet auf eine neue Anfrage für den Browser. Es ist nur so, dass Sie dem Browser mitgeteilt haben, welche Anfrage er als nächstes senden soll, indem Sie einen HTTP 302-Statuscode zurücksenden.
Grundsätzlich gilt:
link_to ist eine Hilfsmethode zum Generieren von URLs, die normalerweise in Ihren Ansichten verwendet werden (.html.erb -Dateien.
render weist Ihren Controller an, eine Ansicht zu rendern, ohne Daten (z. B. aus einem Formular) an die nächste Controller-Aktion zu übergeben.
redirect_to führt eine 302-Seiten-Weiterleitung durch, wobei Daten (z. B. aus einem Formular) an eine Controller-Aktion in Ihrer Web-App oder eine externe App (z. B. google, facebook, einen von Ihnen bevorzugten Web-Artikel usw.) weitergegeben werden.
link_to
wird in ERB-Vorlagen verwendet. Es gibt einen Link zu einem bestimmten Pfad oder einer bestimmten URL.
redirect_to
ist für Controller vorgesehen. Der Client fordert den angegebenen Pfad oder die angegebene URL an, sobald die Controller-Methode beendet ist.
render
ist auch für Controller geeignet. Dadurch wird die angegebene Vorlage von Rails gerendert.
redirect_to
und render
dürfen in einer gegebenen Controller-Methode nur einmal aufgerufen werden.
Ich habe tatsächlich habe gerade einen Blog-Beitrag darüber geschrieben . Die wichtigsten Bits werden nachfolgend (mit Änderungen) kopiert.
render
vs. redirect_to
render
und redirect_to
Sind die beiden Möglichkeiten, wie Controller-Aktionen enden (im Allgemeinen). Um zu verstehen, wie sie funktionieren, sehen wir uns an, was Controller in einer Rails App tun:
GET /books/index.html
)books GET /books/index(.:format) books#index
)Dieser letzte Schritt wird explizit ausgeführt, wenn Sie render
oder redirect_to
Aufrufen oder implizit, wenn Sie ihn weglassen .
Das ist,
def index
@books = Book.all
end
ist das gleiche wie
def index
@books = Book.all
render :index
end
render :index
sagt: 'Kombiniere die von mir aufbereiteten Daten (@books = Book.all
) Mit der Ansichtsvorlage books/index.html.erb
, Um eine vollständige Ansicht zu erstellen Senden Sie das HTML-Dokument an den Client zurück. '
redirect_to @book
sagt: 'Fordern Sie den Client auf, den gesamten Prozess erneut zu starten und eine neue GET
-Anforderung an url_for(@book)
zu senden. .
Wenn Sie beide weglassen, wird durch die Aktion eine Vorlage mit demselben Namen wie die Aktion selbst gerendert. Mit anderen Worten, Sie müssen render
nur dann explizit aufrufen, wenn die gewünschte Ansichtsvorlage nicht mit der Aktion übereinstimmt, aus der Sie sie rendern.
Beachten Sie, dass nicht jede Controller-Aktion über eine entsprechende Ansichtsvorlage verfügt. Im Allgemeinen versuchen #create
, #update
Und #destroy
(Die alle an HTTP-Anforderungen ohne GET
weitergeleitet werden), Änderungen an der Datenbank vorzunehmen Entweder redirect_to
eine Ressource (falls erfolgreich) oder render
das vorangegangene Formular sowie alle Fehler (falls fehlgeschlagen).
Wie die offiziellen Führer erklären (Betonung meiner),
Diese beiden Methoden [
render
undredirect_to
] Stellen die beiden in Action Controllers verwendeten grundlegenden Aktionsarchetypen dar: Get-and-show und do-and-redirect . Die meisten Aktionen sind Variationen dieser Themen.
render
vs. link_to
render
wird auch in Ansichtsvorlagen selbst verwendet. Anstatt ein komplettes HTML-Dokument zu generieren, wird eine Teilansichtsvorlage in eine größere Vorlage eingefügt. Hier ist das Fazit:
_nav.html.erb
).render 'nav'
, Wenn Sie den _nav.html.erb
- Teil aus einer Ansicht im selben Ordner einfügen möchten.render 'shared/nav'
, Wenn Sie den Partial at app/views/shared/_nav.html.erb
aus einer beliebigen Sicht in Ihr Projekt aufnehmen möchten .link_to
Ist nur eine bequeme Methode zum Einfügen von Ankertags (a href
- Tags) in Ihre Ansichtsvorlagen. Dies ist hilfreich, da viele der URLs, zu denen Sie einen Link erstellen möchten, andere Seiten in Ihrer Anwendung sind und auf diese URLs mithilfe von Objekten oder "Hilfsmethoden" verwiesen werden kann.
= link_to 'Back', books_path # renders as <a href="/books">Back</a>
= link_to 'View', @book # renders as <a href="/book/1">View</a> or similar
Ein link_to
wird in einem Formular in Rails verwendet und ist ein Helfer, um ein Link-Element in HTML zu erstellen. Die anderen beiden werden nicht in Formularen verwendet, sondern in Controllern.
Sie render
eine Seite, wenn Ihre Controller-Methode mit dieser Seite verknüpft ist. Z.B. Beim Aufruf von "new" sollte die Seite "new item" gerendert werden. Sie erfüllen die gerade gestellte Anfrage.
redirect
wird genau dafür verwendet - Umleitung. Wenn Sie beispielsweise versuchen, auf eine Seite zuzugreifen, auf der Sie angemeldet sein müssen, leiten Sie den Benutzer auf die Anmeldeseite um. Umleitungen erzeugen also im Grunde eine neue Anfrage.
link_to gibt einen Standard-HTML-Anker aus = einen Link (Link_to-Dokumentation)
redirect_to wird im Allgemeinen für Antworten auf Seiten verwendet, z. B. zum Aktualisieren und Löschen. Es nimmt die von Ihnen angegebenen Parameter und leitet Ihre Seite entsprechend. (Weiterleitung zur Dokumentation)
render wird zum Laden von Partials oder zum Laden bestimmter .erb-Dateien in andere Dateien verwendet. (Renderdokumentation)
Es gibt eine Reihe von Beispielen im this Rails-Handbuch, in dem render und redirect_to erklärt werden sollten. link_to unterscheidet sich stark von Rendering und redirect_to
Ein link_to erstellt einen Hyperlink zu einer bestimmten URL, die im HTML-Code angezeigt wird.
Abhängig von bestimmten Optionen entscheidet ein redirect_to, wohin Sie verlinken sollen. Wenn zum Beispiel jemand als Benutzer angemeldet ist, möchten Sie ihm vielleicht seine Einstellungsseite zeigen, andernfalls _ auf die Startseite umleiten.
Ein Renderer öffnet die gerenderte Datei, nimmt deren Inhalt und fügt sie in die vorhandene Datei ein, bevor der gesamte Block an den Empfänger gesendet wird.
Ich hoffe ich habe recht.
Von den offiziellen Rails Guides :
Wie Sie gesehen haben, teilt Render Rails mit, welche Ansicht (oder ein anderes Asset) beim Erstellen einer Antwort verwendet werden soll. Die Methode redirect_to macht etwas anderes: Sie fordert den Browser auf, eine neue Anfrage für eine andere URL zu senden.