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?

War es hilfreich?

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!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top