Während der Entwicklung mit Rails war ich besorgt darüber, wie beim Rendern des Formulars mit dem Rendern umgegangen werden soll. Daher konnte ich den Unterschied zwischen redirect_to und Rendern während der Untersuchung erneut bestätigen, sodass ich es als Erinnerung belassen werde. Übrigens werde ich auch schreiben, dass ich mir für einen Moment Sorgen um das Rendern gemacht habe. (Insbesondere Behandlung von before_action)
・ Ruby 2.6.5 ・ Schienen 6.0.3
Ich habe einen Antrag auf Registrierung von Restaurantinformationen gestellt und die folgenden Aktionen auf dem Controller festgelegt.
shops_controller.rb
def new
@shop = Shop.new
end
def create
@shop = @owner.shops.new(shop_params)
if @shop.save
redirect_to :index
else
render :new
end
end
Ich habe dies ohne nachzudenken geschrieben, aber wenn das Speichern fehlschlägt, warum sollten Sie rendern verwenden, um wieder zum Post-Formular zurückzukehren? Lassen Sie uns darauf zurückblicken.
** Abschließend möchte ich unter Beibehaltung des Eingabeinhalts wieder zum Eingabeformular zurückkehren **.
Warum kann dies durch Rendern anstelle von redirect_to erreicht werden? Lassen Sie uns auf das Verhalten von redirect_to und render zurückblicken.
** redircet_to ist ein Prozess, mit dem die Clientseite auf die angegebene Aktion (oder den angegebenen Pfad) zugreifen kann. ** ** ** Infolgedessen greifen Sie auf die Seite zu, nachdem Sie den MVC-Ablauf erneut überprüft haben. Insbesondere lautet der Ablauf "Zugriff auf die angegebene Aktion erneut ⇨ Ausführen der Aktion der Steuerung ⇨ Anzeigen der entsprechenden Ansicht".
Dies entspricht genau dem Zugriff auf die Aktionsansicht über die URL.
Beim Rendern wird lediglich die Ansicht angezeigt, die der angegebenen Aktion entspricht, ohne die Aktion ** erneut auszuführen. ** ** ** Im Gegensatz zu redirect_to wird die Ansicht zurückgegeben, ohne den Inhalt der neuen Aktion auszuführen.
Schauen wir uns den Code anhand der obigen Erklärung noch einmal an.
shops_controller.rb
def new
@shop = Shop.new
end
def create
@shop = @owner.shops.new(shop_params)
if @shop.save
redirect_to :index
else
render :new
end
end
Da es sich bei der neuen Aktion um eine neue Registrierungsseite für Shopinformationen handelt, wird in der Aktion @ shop = Shop.new definiert. (Erstellen Sie eine leere Instanz) Danach wird der in das Formular eingegebene Wert als Parameter übergeben und kann gespeichert werden, indem er zusammen mit den Informationen von @shop, die diesmal durch die Aktion create erstellt wurden, übergeben wird.
Wenn das Speichern fehlschlägt (im Fall von else), wird es erneut an das Formular zurückgegeben. Wenn jedoch zu diesem Zeitpunkt ** redirect_to verwendet wird, wird die neue Aktion erneut ausgeführt und @shop wird wieder zu einer leeren Instanz. ** ** **
Wenn Sie dagegen ** rendern verwenden, wird die neue Aktion nicht verwendet, sodass @shop die Formularansicht erneut anzeigt, während die Werte der von der Erstellungsaktion empfangenen Parameter beibehalten werden. ** ** **
haml:new.html.haml
.shop-wrapper
= form_with model: [@owner, @shop], html: {class: "shopform"}, local: true do |f|
Das Obige ist ein Auszug aus der Ansicht, aber da das Formular @owner und @shop empfängt und den Inhalt anzeigt, wird der Inhalt ordnungsgemäß angezeigt, wenn der @shop Inhalt enthält.
Aus diesem Grund sollten Sie rendern verwenden, wenn die Erstellungsaktion fehlschlägt.
Übrigens, als ich diesmal das Rendern einstellte, trat zum ersten Mal der folgende Fehler auf.
Für einen Moment passierte dies, aber ich habe die folgende before_aciton für die neue Aktion festgelegt.
shops_controller.rb
before_action :set_select_lists, only: [:new]
#Unterlassung
private
def set_select_lists
@stations = Station.all.map {|station| [station.name, station.id] }.unshift(["Bitte wählen Sie aus den folgenden", nil])
@genres = Genre.all.map {|genre| [genre.name, genre.id] }.unshift(["Bitte wählen Sie aus den folgenden(Verpflichtend)", nil])
@marks = Mark.all.map {|mark| [mark.favorite, mark.id] }.unshift(["Bitte wählen Sie aus den folgenden(Verpflichtend)", nil])
end
Ich habe eine Pulldown-Auswahlliste im Formular erstellt und diese mit before_action festgelegt.
Wie ich bereits geschrieben habe, wird beim Rendern die neue Aktion nicht erneut ausgeführt, sodass ** before_action nicht ausgeführt wird → Es gibt keinen festgelegten Wert und es tritt ein Fehler in der Ansichtsanzeige ** auf.
Als Antwort darauf dachte ich für einen Moment: "Wenn es eine Variable gibt, die ich bei @shop unerwartet definieren muss, kann ich Render verwenden?", Aber nachdem ich ein paar Minuten nachgedacht hatte, löste ich sie sofort.
Schreiben Sie die Erstellungsaktion wie folgt um.
shops_controller.rb
def create
@shop = @owner.shops.new(shop_params)
if @shop.save
else
set_select_lists
render :new
end
end
Durch Ausführen von set_select_lists, die vor dem Rendern mit create action in before_action ausgeführt wurden, können Sie mit dem ebenfalls erfassten Wert rendern (render führt erst nach dem Ausführen von create action eine neue Ansicht aus). Weil es angezeigt wird)
Für einen Augenblick? ?? ?? Aber es war keine so komplizierte Geschichte.
Tatsächlich war das Verhalten von redirect_to und render der Ort, an dem ich das Programmieren mit Progate zum ersten Mal berührte, und es war das beunruhigendste seit ungefähr einem Monat. Als ich den Unterschied hier bemerkte, hatte ich das Bild, dass sich mein Verständnis von MVC gleichzeitig vertiefte.
Ich hoffe, es wird für Anfänger wie mich hilfreich sein.
Recommended Posts