Wie kann ich form.select ein Modell in Rails zurückkehren?
-
03-07-2019 - |
Frage
Ich habe ein Modell namens Kontakt, den Gast has_one wie so.
class Contact < ActiveRecord::Base
has_one :guest, :class_name => "Contact", :foreign_key => "guest"
end
In meinem erstellen Ansicht ich die select-Hilfsmethode bin mit, um alle Kontaktliste, das wie so als Gast gewählt werden kann ...
<% form_for(@contact) do |f| %>
<%= f.error_messages %>
...
<p>
<%= f.label :guest %><br />
<% @guests = Contact.find(:all, :order => "lastname").map { |u| [u.lastname + ', ' + u.firstname, u.id] } %>
<%= f.select :guest, @guests, {:include_blank => true} %>
</p>
...
<% end %>
Jedes Mal, wenn dieses Formular abgeschickt wird erhalte ich eine Fehlermeldung, dass es erwartet einen Kontakt bekam aber einen String.
Wo und wie soll ich die Zeichenfolge zu konvertieren, indem die Form zu einem Kontakt vorgelegt, bevor ich den aktuellen Kontakt in die Datenbank speichern?
Lösung
Wenn Sie eine Zuordnung in Rails, wie has_one schaffen, gibt es bestimmte Methoden, die eine dynamisch für die einfache Zuordnung für Ihr Objekt erzeugt.
Im Moment ist die Methode, die Sie verwenden, ist
@contact.guest = @guest
Und Ihre Kontaktobjekt erwartet ein anderes Objekt Active zu erhalten, dass sie mit sich selbst assoziieren kann. Was Sie versuchen, obwohl zu tun, ist eine Art „fake“ diese Methode in Ihrem Formular, das ein Modellobjekt umschließt. (Die Informationen kommen aus dem params wird als String gebracht, weshalb man diesen Fehler bekommen)
Es gibt mehrere Möglichkeiten, wie Sie über die Implementierung dieser gehen könnte. Die erste ist mit verschachtelten Modell Attribute verwenden. . . komplexe Formen, die es Ihnen ermöglichen, ein Kind Vereinigung innerhalb der form_for
wickeln Sie verwenden (die fields_for
Form Helfer verwenden). 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 Komplex bildet einen Teil 1
Railscasts Complex Forms Teil 2
Railscasts Complex Forms Teil 3
Auch wenn Sie mit Rails 2.3 dann einige Informationen Check-out „accepts_nested_attributes_for
“. . . Es gibt einen deutlichen Mangel an Tutorials gibt im Moment, aber ich denke, mit der Veröffentlichung von 2.3 gibt es werde kommt viel sein. Dieser praktische kleine Helfer wird etwa die Hälfte des Codes ausgeschnitten Ryan in seinem Bildschirm verwendet wirft Formen, um ein subbordinate Modell akzeptieren.
Schließlich gibt es eine Abhilfe. Wenn Ihre Beziehung ist einfach, wenn die Gäste Sie verknüpfen möchten bereits in der Datenbank vorhanden sind, und Sie brauchen keine neuen aus dem Formular erstellen Sie verwenden, dann können Sie so 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!