Domanda

Ho una relazione molti-a-molti con una scatola di collegamento, e voglio tirare quei modelli insieme in una forma in modo da poter aggiornare dalla stessa pagina. Sono davvero alle prese con ricevendo il check_box per mostrare anche tutti gli elementi del mio array - Ho perlustrato la rete e lavorando a questo letteralmente tutto il giorno, e mi sto trovando difficile applicare le informazioni che sto leggendo a il mio problema. Sono anche estremamente nuovo per RoR e sono stato a seguito di un po 'di un video tutorial obsoleto (pre 2.0) in modo scuse per il mio codice. Finora, ho capito di uscita solo una coppia di chiavi nella matrice (l'ultima) - anche se al di fuori del modulo, il codice utilizzato nel tutorial funziona esattamente come dovrebbe. Quello è di scarsa utilità però! Host è il modello per il quale la forma principale è per, e fatturazione è il modello esterno che sto cercando di aggiungere al modulo.

Questo è il codice che funziona al di fuori della forma dal tutorial:

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

Ho solo bisogno di sapere come farlo funzionare all'interno del modulo. Questo è il codice di cui sopra che recupera solo l'ultima coppia di chiavi matrice dopo loop attraverso di loro:

<% 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 %>

Il 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: {}

Qualsiasi aiuto molto apprezzato.

È stato utile?

Soluzione

Craig, suona come quello che stai cercando è accepts_nested_attributes_for che è un modo molto migliore di gestire modelli annidati in una forma.

Piuttosto che limitarsi a rubare tutto il lavoro di Ryan e ripubblicare qui, mi limiterò a dare un link al suo screencast:

http://railscasts.com/episodes/196-nested -model-form-parte-1

Questo è basato fuori la sua complessa serie di forme.

Si dovrebbe essere in grado di taylor questo tutorial per ciò che si sta cercando di fare, ma se non sarei felice di aiutare.

Modifica

Bene, dopo aver guardato il codice, ci sono alcune cose che causano problemi. :)

Prima di tutto, con le associazioni, non c'è bisogno di tirare una collezione in più per fatturazioni, cioè:.

@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

Il setup associazione nel modello fa tutto questo per voi. Questa è parte della magia di rotaie. : D

Ora, è importante notare che quando si utilizzano le associazioni è necessario fare in modo che gli oggetti sono in realtà associate. In altre parole, se si dispone di 3 oggetti Billings nel database e non sono associati con l'oggetto Host, essi non presentarsi in forma.

Se si sta tentando di associare una fatturazione a un host utilizzando una casella di controllo che si sta andando a voler adottare un approccio diverso, perché il modulo con la sola visualizzazione Billings già associato con il vostro ospite.

Se il tuo solo cercando di modificare o modificare Billings esistenti che sono associati con l'host, in cui la casella di controllo rappresenta un attributo 'a pagamento' (un valore booleano) per esempio, allora questo approccio va bene e il tuo codice di modulo potrebbe essere simile a questa :

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

Quindi, forse, chiarire ciò che il vostro cercando di realizzare dal punto di vista funzionalità e siamo in grado di trovare una soluzione migliore.

Altri suggerimenti

Io non sono sicuro circa la mia risposta, ma ci proverò ...

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

A me sembra che sia un problema con il for-loop ...

Nel codice esempio, si sta loop attraverso il @billings (un array di Billings oggetti passati dal controller), e chiamando quello attuale billing.

Nel codice modulo, si sta loop attraverso il :billings (simbolo riferimento ai Billings ActiveRecords) e chiamando quello attuale obj. Poi, confusamente, il vostro codice ri-utilizza il nome obj variabili di nuovo nella funzione @ billings.collect ... ma questo dovrebbe avere la possibilità privato locale e non effettuare la vostra ciclo principale, ma è difficile da interpretare a vista.

In ogni caso, dal momento che la roba dentro il ciclo modulo non fa riferimento obj che usa la variabile billing - che non cambia quando si esegue un ciclo, ma mantiene l'ultimo valore che aveva: l'ultimo elemento dal ciclo precedente ! Questo spiega il motivo per cui si vede solo l'ultimo tag. (Inoltre, la funzione debug(@billings) fa il suo loop tra i record di sorta -. Non è all'interno del fields_for fare loop)

Vorrei iniziare con cambiare la prima riga del codice del modulo di riutilizzare il nome billing variabile ancora una volta, in questo modo:

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

sintassi del blocco di Ruby può essere piuttosto confusa in un primo momento - o, diamine, ogni volta che si 're la lettura del codice non hai scritto te stesso - ma quando si interrompe il tutto verso il basso per i componenti di base, di solito è solo loop attraverso una serie di elementi e l'esecuzione di alcune funzioni su ciascuno di essi. Anche attenzione per la confusione tra nomi simili di aspetto: @billing, @billings,: fatturazioni e fatturazioni sono tutte cose diverse per Ruby e Rails. In bocca al lupo!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top