2010-10-20 9 views
5

Ho una forma complessa (come Ryana B's Complex Form Railscasts) in cui ho alcuni livelli di tabelle del database che vengono modificati allo stesso tempo.Options_for_select - come selezionare cosa c'è nel database?

Il codice per questa casella a discesa funziona in quanto fornisce il numero intero corretto al database. Ma, nonostante numerosi tentativi, non riesco a farlo riflettere correttamente il valore CURRENT del database. Come posso risolvere questo codice?

<%= o.select :weighting, options_for_select([ 
    ["Correct", "4", {:class=>"bold"}], 
    ["Good", "3"], 
    ["Average", "2"], 
    ["Poor", "1"], 
    ["Incorrect", "0", {:class=>"bold"}] ], :weighting), {}, 
    html_options = {:class => "listBox", :style=>"float:left;"} %> 

Grazie.

+0

Ho aggiornato la mia risposta a contenere un esempio di come fare questo quando hai a disposizione solo un oggetto form builder. – EmFi

risposta

13

Sei sulla strada giusta, ma non del tutto lì.

Mentre l'argomento finale su options_for_select dovrebbe essere il valore dell'opzione selezionata. Il valore fornito :weighting è un simbolo che non corrisponde al valore di nessuna delle opzioni specificate.

Sarà necessario fornire il valore effettivo. Se è stato utilizzato un oggetto istanza per costruire la forma come in

<%form_for @whatever do |o|%> 
... 

Si può semplicemente utilizzato @whatever.weighting.to_s come in:

<%= o.select :weighting, options_for_select([ 
    ["Correct", "4", {:class=>"bold"}], 
    ["Good", "3"], 
    ["Average", "2"], 
    ["Poor", "1"], 
    ["Incorrect", "0", {:class=>"bold"}] ], @whatever.weighting.to_s), {}, 
    html_options = {:class => "listBox", :style=>"float:left;"} %> 

In caso contrario, c'è un modo per ottenere l'oggetto fuori dalla variabile del blocco modulo o. Ma questo è scherzare con interni che possono cambiare con un aggiornamento.

Modifica: Nel caso in cui si lavori con campi per e più parziali, è possibile estrarre l'oggetto particolare dalla variabile di blocco del modulo build.con l'oggetto accessor.

Riutilizzare l'esempio precedente in modo simile a questo per utilizzare la ponderazione corrente di ogni istanza figlio nella sezione di tale istanza del modulo.

<% form_for @parent do |p| %> 
    ... 
    <% p.fields_for :children do |c| %> 
    ... 
    <%= c.select :weighting, options_for_select([ 
     ["Correct", "4", {:class=>"bold"}], 
     ["Good", "3"], 
     ["Average", "2"], 
     ["Poor", "1"], 
     ["Incorrect", "0", {:class=>"bold"}] ], c.object.weighting.to_s), {}, 
     html_options = {:class => "listBox", :style=>"float:left;"} %> 
    ... 
    <% end %> 
<% end %> 

Questo può essere utilizzato anche in parziali.

+0

EmFi, ho una situazione di Ryan Bates Complex Forms 3 in cui i campi per i partial devono accedere alle loro variabili. Per quelli, ho un genitore e più figli - come potrei accedere al valore di un particolare bambino? – sscirrus

+0

Ho aggiornato la risposta per soddisfare le tue esigenze specifiche. – EmFi

+0

Sei fantastico EmFi. Grazie! – sscirrus

0

seconda prova =)

<%= f.label :priority %> 
<%= f.select(:priority, options_for_select({"Stat" => "1", "Urgent" => "2", "Regular" => "3", "Safety" => "4"}, @servicerequest.priority), :prompt => "Choose") %>