accresents_nested_attributes_für die Validierung der untergeordneten Zuordnung fehlgeschlagen
Ich bin mit accepts_nested_attributes_for in einem meiner Rails-Modelle, und ich möchten, speichern Sie die Kinder nach dem erstellen der übergeordneten.
Form perfekt funktioniert, aber die Validierung fehlschlägt. Der Einfachheit halber stellen Sie sich Folgendes vor:
class Project < ActiveRecord::Base
has_many :tasks
accepts_nested_attributes_for :tasks
end
class Task < ActiveRecord::Base
belongs_to :project
validates_presence_of :project_id
validates_associated :project
end
Und ich bin mit:
Project.create!(
:name => 'Something',
:task_attributes => [ { :name => '123' }, { :name => '456' } ]
)
Beim speichern des Projekt-Modell, die Validierung fehlschlägt, auf die Aufgaben, weil Sie nicht haben eine project_id (da das Projekt noch nicht gespeichert wurde).
Wie es scheint, Schienen nach dem Muster unten:
- Validieren Projekt
- Validieren Aufgaben
- Projekt Speichern
- Speichern Aufgaben
Das Muster sollte:
- Validieren Projekt
- Auf den Pass: Projekt Speichern und weiter...
- Validieren Aufgaben
- Auf Den Pass: Sparen Sie Aufgaben
- Auf Fail: Projekt Löschen (rollback vielleicht?)
Also meine Frage hinausläuft: Wie kann ich die Schienen laufen die project_id= (oder Projekt=) - Methode und die überprüfung auf die Kinder (Aufgaben) NACH den übergeordneten (Projekt) gespeichert wurde, aber NICHT speichern Sie die übergeordneten (Projekt) - Modell, wenn jedes Kind (Aufgabe) ist ungültig?
Irgendwelche Ideen?
InformationsquelleAutor der Frage Ryan Townsend | 2009-06-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie diese Antwort für Schienen 2, sonst siehe unten für die
:inverse_of
AntwortKönnen Sie umgehen dies, indem nicht überprüfung der für die project_id, wenn das zugehörige Projekt gültig ist.
InformationsquelleAutor der Antwort The Who
Verwenden
:inverse_of
undvalidates_presence_of :parent
. Dies sollte fix your validation problem.http://apidock.com/rails/ActiveModel/Validations/HelperMethods/validates_presence_of
https://github.com/rails/rails/blob/73f2d37505025a446bb5314a090f412d0fceb8ca/activerecord/test/cases/nested_attributes_test.rb
InformationsquelleAutor der Antwort boblin
Überprüfen nur die Beziehung, nicht die ID:
Sobald der Verein ist aufgefüllt, ActiveRecord befassen sich mit der Validierung erreicht haben, unabhängig davon, ob das Modell gespeichert. Sie möglicherweise wollen untersuchen, automatisches speichern, als auch, um sicherzustellen, die Aufgabe, das Projekt wird immer gespeichert:
InformationsquelleAutor der Antwort François Beausoleil
Leider keiner der oben genannten Vorschläge für mich arbeiten mit Rails 2.3.5.
In meinem Fall, das Projekt in einer Aufgabe ist immer null, wenn beide erstellt mit verschachtelten Attribute. Nur, wenn ich entfernen Sie die validates_presence_of, das erstellen geht durch erfolgreich. Der unit test und die log zeigen, dass alles korrekt erstellt wurde.
So, ich würde jetzt dazu neigen, fügen Sie Einschränkungen für die DB anstelle der Schienen, das scheint zu sein, zuverlässig in den ersten Platz.
InformationsquelleAutor der Antwort Michael Reinsch
Sie könnte einfach erstellen Sie das Projekt, und fügen Sie nur die Projekte, wenn es geht Validierung:
Ciao
InformationsquelleAutor der Antwort
Im Gegensatz zu dem, was bigo schon sagt, es ist nicht immer akzeptabel, speichern Sie das übergeordnete Objekt zuerst und dann die Kinder. In der Regel wollen Sie sicherstellen, dass alle Objekte überprüfen, bevor Sie mit dem sparen beginnen. Das gibt dem Benutzer die Möglichkeit zu re-Bearbeiten Sie die Eingabe-Formular und korrigieren Sie eventuelle Fehler.
Das problem, das Sie beschreiben, wird behoben werden in Rails 3.0. Hätte ich einen link gepostet, der Leuchtturm ticket, aber stackoverflow.com ist das nicht möglich weil ich bin ein neuer user (#fail). Aber vorerst, können Sie das plugin "parental_control", die Korrektur Ihrer "Fehler".
InformationsquelleAutor der Antwort Thomas Watson