Frage

habe ich eine many-to-many-Beziehung mit einem Link-Box, und ich möchte, um diese Modelle ziehen zusammen in eine Form, damit ich von der gleichen Seite aktualisieren. Ich bin wirklich kämpfen mit den check_box bekommen sogar alle Elemente meiner Array zeigen - ich das Netz durchforstet habe und wurde auf dieser buchstäblich den ganzen Tag zu arbeiten, und ich finde es schwierig, die Informationen anzuwenden lese ich auf mein Problem. Ich bin auch sehr neu in RoR und ich habe nach einem Bit einer veralteten Video-Tutorial gewesen (vor 2.0) so entschuldige mich für meinen Code. Bisher habe ich es zur Ausgabe nur ein Schlüsselpaar in der Anordnung (die letzte) bekam - obwohl außerhalb der Form, der Code im Tutorial funktioniert genau, wie es sein sollte. Das ist wenig hilfreich aber! Host ist das Modell für das das Hauptformular für ist, und Billing ist das Außen Modell, dass ich versuche, um das Formular hinzuzufügen.

Dies ist der Code, der außerhalb des Formulars aus dem Tutorial funktioniert:

<% for billing in @billings -%>
<%= check_box_tag('billing_title[]', billing.id, @host.billings.collect
{|obj| obj.id}.include?(billing.id))%> <%= billing.title %><br />
<% end -%>

Ich muss nur wissen, wie es in der Form arbeiten zu machen. Dies ist der oben genannte Code, nur ruft das letzte Array-Schlüsselpaar, nachdem er durch sie Looping:

<% f.fields_for :billings do |obj| %><br />
<%= check_box_tag('billing_title[]', billing.id, @billings.collect
{|obj| obj.id}.include?(billing.id))%> <%= billing.title %><br />
<% end %>

Die debug (@billings):

--- 
- !ruby/object:Billing 
attributes: 
title: Every Month
id: "1"
attributes_cache: {}

- !ruby/object:Billing 
attributes: 
title: 12 Months
id: "2"
attributes_cache: {}

- !ruby/object:Billing 
attributes: 
title: 6 Months
id: "5"
attributes_cache: {}

Jede Hilfe wirklich zu schätzen.

War es hilfreich?

Lösung

Craig, es klingt wie das, was Sie suchen accepts_nested_attributes_for die eine viel bessere Möglichkeit, verschachtelte Modelle in Form der Handhabung.

Anstatt nur alle Ryans Arbeit zu stehlen und es hier umbuchen, werde ich Sie nur einen Link zu seinem Screen:

http://railscasts.com/episodes/196-nested -Modell-form-Teil-1

Dies basiert von seiner komplexen Formen Serie.

Sie sollten dieses Tutorial zu taylor der Lage sein, zu dem, was Sie zu tun versuchen, aber wenn nicht würde ich Ihnen gerne behilflich sein.

EDIT:

In Ordnung, nachdem in Ihrem Code suchen, gibt es ein paar Dinge, die Sie Probleme zu verursachen. :)

Zu allererst mit Verbänden, brauchen Sie nicht eine zusätzliche Sammlung für billings zu ziehen, das heißt:.

@host = Host.find(params[:id])
@voips = Voip.find(:all)
@custsupps = Custsupp.find(:all)
@payments = Payment.find(:all)
@billings = Billing.find(:all) # <-- This is not needed and causing your problems

Der Verband Setup im Modell hat das alles für Sie. Dies ist Teil der Magie von Schienen. : D

Jetzt ist es wichtig zu beachten, dass, wenn Verbände mit Sie brauchen, um sicherzustellen, dass die Objekte tatsächlich zugeordnet sind. Mit anderen Worten, wenn Sie 3 Billings Objekte in Ihrer Datenbank haben, und sie sind nicht mit dem Host-Objekt zugeordnet ist, werden sie nicht in der Form auf.

Wenn Sie versuchen, eine Abrechnung zu einem Host zu verknüpfen eine Checkbox verwenden Sie einen anderen Ansatz nehmen gehen zu wollen, weil Ihr Formular mit nur Anzeige Billings bereits zugeordnet mit Ihrem Gastgeber.

Wenn Ihr nur zu bearbeiten versuchen oder modifizieren bestehende Billings, die auf dem Host verbunden sind, wo die Checkbox ein ‚bezahlt‘ Attribut stellt (a boolean) zum Beispiel, dann ist dieser Ansatz in Ordnung und Ihre Form Code würde wie folgt aussehen :

<% f.fields_for :billings do |b| %><br />
  <%= b.check_box :paid %> <%= b.title %>
<% end %>

Also vielleicht klären, was Ihr versucht, von einer Funktionalität Standpunkt zu erreichen, und wir können eine bessere Lösung finden.

Andere Tipps

ich bin nicht sicher über meine Antwort, aber ich werde es versuchen ...

<% f.fields_for :billings, @billings do |obj| %>
   # ...
<% end %>

scheint mir, wie es ist ein Problem mit der for-Schleifen ...

In Ihrem Beispiel-Code, Sie Schleifen der @billings (ein Array von billings von Ihrem Controller übergeben Objekte) und das aktuelle billing aufrufen.

In Ihrem Formularcode Sie Schleifen der :billings (Symbol der billings ActiveRecords Referenzierung) und das aktuelle obj aufrufen. Dann verwechselbar, Ihr Code wiederverwendet die Variablennamen obj wieder in der @ billings.collect Funktion ... aber dies sollte lokale private Anwendungsbereich hat und nicht Ihre Hauptschleife bewirken, aber es ist schwer, auf Sicht zu interpretieren.

Wie auch immer, da die Sachen in Ihrer Form Schleife nicht Bezug obj, wird die Variable billing mit - das ändert sich nicht, wenn Sie eine Schleife durch, sondern hält den letzten Wert hatte: das letzte Element aus der vorherigen Schleife ! Dies erklärt, warum nur Sie den letzten Tag zu sehen. (Auch die debug(@billings) Funktion hat sein eigenes Looping durch die Aufzeichnungen der Art - es ist nicht in der fields_for Schleife tun.)

Ich würde mit der Änderung der ersten Zeile des Formulars Code starten Wiederverwendung der Variablennamen billing wieder, wie folgt aus:

<% f.fields_for :billings do |billing| %><br />

Rubys Block Syntax ziemlich werden kann verwirrend auf den ersten - oder, was solls, wann immer Sie ‚re Code liest du hast dich nicht schreiben - aber wenn man alles bis auf die Grundkomponenten brechen, ist es in der Regel nur durch eine Reihe von Elementen Looping und auf jeder eine Funktion ausführt. Achten Sie auch auf die Verwirrung zwischen ähnlich aussehenden Namen: @billing, @billings,: billings und billings sind alle verschiedene Dinge für Ruby und Rails. Viel Glück!

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