2009-08-18 6 views
0

Ich habe ein Formular erstellt, das Daten aus 2 Tabellen (Eltern und Kind) anzeigen muss. Wenn das Formular gesendet wird, werden nur die untergeordneten Felder aktualisiert (die übergeordneten Felder sollen nur angezeigt werden). Während die übergeordneten Modellfelder angezeigt werden, müssen diese vor Aktualisierungen geschützt werden (vorzugsweise über den Formbuilder und nicht über CSS).Rails Form Builders - So zeigen Sie ein schreibgeschütztes Feld an oder schützen ein Feld

FWIW dies ist ein ziemlich häufiger Master/Detail Use Case. Ich konnte jedoch keine Beispiele dafür finden - die meisten Beispiele, die ich gesehen habe, scheinen trivial zu sein/Einzelmodellanzeige/Aktualisierung, bei der alle angezeigten Felder aktualisierbar sind.

Alle Ideen/Beispiele/Vorschläge/Tutorials/Beispiele von realen Welt, Multi-Modell-Rails Formen wäre hilfreich.

TIA

Antwort

0

Thx für die Antworten, die geholfen haben, mein Problem/meine Frage zu lösen. Ich will das nur schließen, falls es anderen in der Zukunft hilft.

Es stellte sich heraus, dass ich einen Fehler erhalten habe, der versucht, auf mein übergeordnetes Datenelement (patients.lname) zu verweisen, da es in einer Reihe von Ergebnissen und nicht als einzelnes Ergebnis übergeben wurde.Aus meiner Sicht Controller hatte ich:

@visit = Visit.all(:select => "visits.id, visits.visittype, visits.visitdate, events.patient_id, patients.lname", 
    :conditions => ["visits.id = ?",params[:id] ], 
    :joins => "INNER JOIN events on events.id = visits.event_id INNER JOIN patients on patients.id = events.patient_id") 

Aus meiner Sicht hatte ich (das mir einen ungültigen Verweis gab, wie ich ein tat finden alle oben):

<h1>Editing visit for patient : 
<%= @visit.lname %>   # should be <%= @visit[0].lname %> 
</h1> 

Unterhalb der verbesserte (und einfachere) Version, wo ich den bestimmten Datensatz zu ersetzen ich brauche finden (im Grunde alle mit findet zuerst finden):

@visit = Visit.find(:first, :select => "visits.id, visits.visittype, visits.visitdate, events.patient_id, patients.lname", 
     :conditions => ["visits.id = ?",params[:id] ], 
     :joins => "INNER JOIN events on events.id = visits.event_id INNER JOIN patients on patients.id = events.patient_id") 

Und in der Ansicht:

<% form_for(@visit, :builder => LabelFormBuilder) do |f| %> 
    <%= f.error_messages %> 
    Name: <%= @visit.lname %> 
    <%= f.text_field :visittype %> 
    <%= f.date_select :visitdate %> 
    <p> 
    <%= f.submit 'Update' %> 
    </p> 
<% end %> 

Manchmal ist es schwer, das Holz für die Bäume zu sehen! Hoffe das hilft jemand anderem.

1

Nur aus Interesse heraus, warum die Mühe gehen durch die Bewegungen eines Multi-Modell-Form zu schaffen, wenn man nur das Kind Datensatz aktualisieren? Mein Rat würde sein, halten Sie Ihre Form einfach, d.e. Machen Sie es zu einem untergeordneten Formular und zeigen Sie nur die Daten aus dem übergeordneten Datensatz an. Wenn es sein muss, könnten Sie sogar die Anzeige so gestalten, dass sie wie ein Teil des Formulars aussieht, obwohl ich denke, dass das den Benutzer abschrecken könnte.

Wenn Sie wirklich tun müssen, was Sie tun, würde ich immer noch CSS verwenden, um die Eingabefelder zu deaktivieren/nur zu lesen und in der Controller-Update-Aktion geben Sie nur die Attribute, die Sie aktualisieren, in den Methodenaufruf update_attributes.

Schließlich, vielleicht in die attr_protected-Methode zu sehen, um die Felder zu verhindern, die Sie Schutz vor zufälligen Massenzuweisung wollen.

+0

OK - Ein Kind-Formular, das Daten von einem Elternteil anzeigt, ist, was ich hier war (vielleicht habe ich die Frage schlecht formuliert?). Wie auch immer, ich bin immer noch unklar, wie man die Eltern-Datensatz-Felder schreibgeschützt machen soll - AFAIK Standardmäßig erstellt der Formular-Builder Eingabefelder für alle Modellfelder. Ein Beispiel wäre hier hilfreich. – BrendanC

+0

Können Sie mir Ihren aktuellen 'Form Builder' Code zeigen? Ich bin immer noch ein wenig verwirrt darüber, was du meinst. Wenn Sie das Formular erstellen, können Sie alle Felder, die Sie sehen, haben. – tsdbrown

0

Ich stimme mit tsdbrown überein, ich glaube nicht, dass eine komplexe Form erforderlich ist. Wenn Sie mehr über komplexe Formen erfahren möchten oder wenn Sie ein komplexes Formular verwenden möchten, empfehlen wir Ihnen, die Railscasts episodes (73 - 75) zu betrachten.

0

Wie tsdbrown bereits gesagt hat, fügen Sie Ihren Formularen eine Komplexitätsebene hinzu, die nicht benötigt wird. Wenn alles, was Sie wollen, ist ein Detail Modell zu aktualisieren, während zeigt einige Informationen davon Eltern, könnten Sie tun nur so etwas wie:

Order number: <%= @line_item.order.number %> 
Order date: <%= @line_item.order.order_date %> 

<% form_for @line_item do |f| %> 
    <%= f.label :quantity %> 
    <%= f.text_edit :quantity %> 
<% end %> 

Wenn Sie möchten, dass beide bearbeiten, dann können Sie sich auf die Forschung field_for und verschachtelte Formulare Methoden (der Vorschlag von Railscasts erwähnt, bevor es großartig ist).

Verwandte Themen