[RUBY] [Rails] Warum wird gerendert, wenn das Speichern erfolgreich ist und redirect_to fehlschlägt?

Einführung

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)

Umgebung

・ Ruby 2.6.5 ・ Schienen 6.0.3

Status

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.

Was ist redirect_to

** 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.

Was ist rendern

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.

Der Grund, warum der Eingabeinhalt beim Rendern beibehalten wird

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.

Der Fehler, auf den ich diesmal gestoßen bin

Übrigens, als ich diesmal das Rendern einstellte, trat zum ersten Mal der folgende Fehler auf. スクリーンショット 2020-06-26 21.45.44.png

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.

Am Ende

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

[Rails] Warum wird gerendert, wenn das Speichern erfolgreich ist und redirect_to fehlschlägt?
[Rails] Unterschied zwischen redirect_to und Rendern
[Rails] Unterschied zwischen redirect_to und render [Anfänger]
Schienen rendern redirect_to
[Rails] Fehlermeldung anzeigen - Unterschied zwischen render und redirect_to, flash-
[Rails] Was ist der Unterschied zwischen Redirect und Rendering?
[Rails] Verschiedene Unterschiede zwischen redirect_to und Render-Methode und Ausgabemethode der Render-Methode
Schienen sind schwierig und schmerzhaft!
Schienen sind schwierig und schmerzhaft! Ⅱ
Unterschied zwischen render und redirect_to
Unterschied zwischen render und redirect_to
[Schienen] Startzeit und Endzeit speichern
Teilen Sie durch Ruby! Warum ist es 0?
Verwenden Sie redirect_to und rendern Sie richtig