Wenn Sie in Rails eine Zuordnung erstellen, z. B. has_one, gibt es bestimmte Methoden, die dynamisch für Ihr Objekt zur einfachen Zuweisung generiert werden.
Im Moment ist die Methode, die Sie verwenden, ist
@contact.guest = @guest
Und Ihre Kontaktobjekt erwartet ein anderes Objekt Active zu erhalten, dass es mit assoziieren kann sich. Was Sie jedoch versuchen, ist eine Art "Fälschung" dieser Methode in Ihrem Formular, die ein Modellobjekt umschließt. (Die Informationen, die von den Parametern kommen, werden als eine Zeichenkette eingefügt, weshalb Sie diesen Fehler erhalten)
Es gibt mehrere Möglichkeiten, wie Sie dies implementieren könnten. Die erste Methode verwendet verschachtelte Modellattribute. . . komplexe Formulare, die es Ihnen ermöglichen, eine untergeordnete Zuordnung innerhalb der form_for
, die Sie verwenden, (mit dem Formularhelfer fields_for
) zu wickeln. Eine Erklärung hierfür wäre eine lange Zeit in Anspruch nehmen zu geben, und zum Glück gibt es unglaubliche freie Ressourcen auf komplexe Formen:
Railscasts Complex Forms part 1
Railscasts Complex Forms part 2
Railscasts Complex Forms part 3
Auch wenn Sie Rails verwenden 2.3 dann lesen Sie einige Informationen über "accepts_nested_attributes_for
". . . Es gibt momentan einen deutlichen Mangel an Tutorials, aber ich stelle mir vor, dass mit der Veröffentlichung von 2.3 eine Menge kommen wird. Dieser handliche kleine Helfer wird ungefähr die Hälfte des Codes ausschneiden, den Ryan in seinen Bildschirm-Casts benutzt, um Formen zu akzeptieren, die ein unterordnetes Modell akzeptieren.
Endlich gibt es einen Workaround. Wenn Ihre Beziehung einfach ist, wenn sich die Gäste, die Sie zuordnen möchten, bereits in der Datenbank befinden und Sie keine neuen aus dem Formular erstellen müssen, das Sie verwenden, können Sie etwas wie ein virtuelles Attribut verwenden. In dem Formular müssen Sie nur Ihre f.select :guest
zu so etwas wie f.select :guest_select
ändern und ein Verfahren in Ihrem Modell implementieren:
def guest_select=(incoming_id_from_form)
contact = Contact.find(incoming_id_from_form)
self.guest = contact
end
Welche das Active Modell zuordnen, ohne eine komplexe Form zu implementieren, die es für Sie zu tun!
Ja. Mein Anwendungsfall ist das Workaround-Szenario ... Danke, Mann. –