2009-05-03 9 views
2

Ich habe ein Modell namens Contact, das has_one Gast so.Wie kann ich form.select machen ein Modell in Rails zurückgeben?

class Contact < ActiveRecord::Base 
    has_one :guest, :class_name => "Contact", :foreign_key => "guest" 
end 

In meiner Ansicht erstellen ich die select-Hilfsmethode bin mit, um alle Kontaktliste, die als Gast gewählt werden kann, wie so ...

<% 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 diese Form vorgelegt wird, bekomme ich eine Fehler, der besagt, dass ein Kontakt erwartet wurde, aber eine Zeichenfolge erhalten wurde.

Wo und wie sollte ich die vom Formular übergebene Zeichenfolge in einen Kontakt konvertieren, bevor ich den aktuellen Kontakt in der Datenbank speichern kann?

Antwort

6

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!

+1

Ja. Mein Anwendungsfall ist das Workaround-Szenario ... Danke, Mann. –

Verwandte Themen