Ausführen von Aktionen nach erfolgreichem Erstellen oder Aktualisieren von Aktionen auf InheritedResources
-
26-10-2019 - |
Frage
Ich entwickle derzeit ein paar Module, um Code von meinen Controllern auf einer Rails 3 mithilfe von InheritedResources (Last Version) -App wiederverwenden zu können.
Meine Idee ist es, ein Verhalten zu haben, das nach einer erfolgreichen Erstellung oder Aktualisierung der Ressource ausgeführt werden sollte, außer dass ich, außer dass die Aktionen "Erstellen" oder "Update" neu anklagen, nicht sicher bin, wie man dies angeht.
Ich benutze gerade so etwas wie
module SessionStorable
extend ActiveSupport::Concern
include Base
included do
before_filter :setup_resource, :only => :new
after_filter :reset_session_resource_id, :only => [:create, :update]
end
# ....
end
Ich habe ein bestimmtes Ressourcen -Setup, das ich unter anderem die ID der Ressource zur Sitzung hinzufügt. Nachdem die Ressource erfolgreich in der BD gespeichert wurde, möchte ich ihre ID aus der Sitzung entfernen und das ist das, was der After_filter tut.
Ich habe es bisher damit zu tun, indem ich auch die Informationen updated_at in der Sitzung speichere und vergleicht, um festzustellen, ob das Modell aktualisiert wurde (wenn ja, hätte es erfolgreich sein müssen) und die Methode ausführen müssen.
Ich bin jedoch nicht mit dem (irgendwie hacky) zufrieden und ich plane auch, andere Module zu haben, die mit Ressourcen funktionieren, nachdem sie aktualisiert wurden und nicht zweimal denselben Ansatz verwenden möchte.
Gibt es einen Haken an IR, den ich verwenden sollte? Oder irgendwelche anderen Ideen, wie man vorgeht?
Lösung
Ich habe es gelöst, indem ich "Object.Erors.EMpty?" Bedingung. Wenn das Objekt nach der Aktion für Erstellen oder Aktualisierung keine Fehler gibt, sollte sicher sein, dass das Modell ordnungsgemäß gespeichert wurde, und so wäre das Ausführen des Codes in Ordnung.
Andere Tipps
Vielleicht könnten Sie stattdessen einen Vererbungsansatz verwenden:
class BaseController < InheritedResources::Base
before_filter :setup_resource, :only => :new
after_filter :reset_session_resource_id, :only => [:create, :update]
# ...
end
class YourController < BaseController
# ...
end
Es tut mir leid, die Antwortfunktion für einen Kommentar zu verwenden, aber da ich sie unter Ihrer Antwort nicht tun kann, sehe ich keine andere Option.
"Object.Erors.Empty?" Bedingung. Wenn das Objekt nach der Aktion für Erstellen oder Aktualisieren keine Fehler gibt, sollte sicher sein, dass das Modell ordnungsgemäß gespeichert wurde
Ich denke, das ist nicht immer wahr, lassen Sie mich Sie und ein Beispiel geben:
class Project < ActiveRecord:Base
has_many :members
# ...
end
Stellen Sie sich vor, Sie haben ein Formular für das Projekt, in dem Sie auch Mitglieder dafür erstellen können (verschachtelte Formulare). Fehler bei der Erstellung der zugehörigen Mitglieder machen das Projektobjekt ungültig, aber die Projektinstanz wird für die Methodenfehler trugen.