In meiner Rails App habe ich ein Modell mit einem Startdatum und einem Enddatum. Wenn der Benutzer Jan 1, 2010 als Startdatum und 5. Januar 2010 als Enddatum auswählt, möchte ich, dass 5 Instanzen meines Modells erstellt werden (eines für jeden ausgewählten Tag). Es sieht also ungefähr wie
aus %Vor%Ich weiß, ein Weg, um damit umzugehen, ist eine Schleife im Controller zu machen. Etwas wie ...
%Vor%Ich möchte jedoch meinen Controller dünn halten, außerdem möchte ich die Modelllogik außerhalb davon behalten. Ich vermute, ich muss die "neue" Methode im Modell überschreiben. Was ist der beste Weg, dies zu tun?
Wie @rad sagt, wollen Sie auf keinen Fall initialisieren. Obwohl Sie after_initialize überschreiben können, sieht das hier nicht wirklich so aus, wie Sie es wollen. Stattdessen möchten Sie wahrscheinlich eine Factory-Methode zur Klasse hinzufügen, wie es @Pasta vorschlägt. Fügen Sie das zu Ihrem Modell hinzu:
%Vor%Und dann fügen Sie das Ihrem Controller hinzu:
%Vor% Überschreibe nicht initialize
Es könnte möglicherweise eine Menge Zeug in deinen Modellen zerstören. WENN wir wüssten, warum Sie Hilfe brauchen, können wir besser helfen (verstehen Sie Ihre Erklärung der Form, die ein Skelett ist, nicht vollständig, wollen Sie, dass Formularattribute andere Attribute erzeugen, siehe unten). Ich benutze oft einen Haken, wie Marcel vorgeschlagen hat. Wenn Sie möchten, dass es immer und nicht nur vor dem Erstellen oder Speichern eines Objekts geschieht, verwenden Sie den after_initialize
-Hook.
Auch wenn Sie nur nach einigen Standardwerten suchen, können Sie Standardaccessoren bereitstellen, etwa: (wobei some_attribute
dem Spaltennamen Ihres Modellattributs entspricht)
oder ein Schreiber
%Vor% Wenn ich Ihren Kommentar richtig verstanden habe, sieht es so aus, als würden Sie ein Formular veröffentlichen, das Ihr Modell unvollständig machen würde, während die anderen Attribute auf Teilen dieses Formulars basieren würden? In diesem Fall können Sie eine der oben genannten Methoden after_initialize
oder some_attribute=
verwenden, um dann andere Attribute in Ihrem Modell zu erstellen.
Ich denke, Sie möchten Standardwerte für Ihr Modellattribut festlegen?
Es gibt eine andere Lösung als das Überschreiben; Sie können Rückrufe einstellen:
%Vor%Das riecht nach der Fabrikmethode Patttern ... suchen Sie es aus.
Wenn Sie aus irgendeinem Grund mit create_date per @Pasta nicht einverstanden sind, erstellen Sie möglicherweise nur ein einfaches Ruby-Objekt (nicht ActiveRecord unterstützt) mit dem Namen YourModelFactory / Template / Was auch immer mit zwei Instanzvariablen - Sie können Ihre Standardparameter verwenden [: foo] um diese zuzuweisen - dann definiere und rufe eine Methode für diese Klasse auf, die deine realen Objekte zurückgibt.
Ihre Steuerungslogik sieht jetzt ungefähr so aus:
%Vor%Viel Glück.
Tags und Links ruby-on-rails