2010-08-26 10 views
11

Sto usando fields_for nella mia forma in questo modofields_for invio matrice anziché Hash (Rails 3)

<%= form_for @user %> 
    ... 
    <%= f.fields_for :photos do |f2| %> 
    <%= f2.radio_button :public, 'true' %> 
    <% end %> 
    ... 
<% end %> 

Qui ci sono i pulsanti di opzione che genera:

<input id="user_photos_attributes_0_public_true" name="user[photos_attributes][0][public]" type="radio" value="true" /> 
<input id="user_photos_attributes_0_id" name="user[photos_attributes][0][id]" type="hidden" value="1" /> 

<input id="user_photos_attributes_1_public_true" name="user[photos_attributes][1][public]" type="radio" value="true" /> 
<input id="user_photos_attributes_1_id" name="user[photos_attributes][1][id]" type="hidden" value="4" /> 

<input id="user_photos_attributes_2_public_true" name="user[photos_attributes][2][public]" type="radio" value="true" /> 
<input id="user_photos_attributes_2_id" name="user[photos_attributes][2][id]" type="hidden" value="5" /> 
... 

ho questo in utente .RB

has_many :photos 
    accepts_nested_attributes_for :photos 

Quando modulo viene inviato ottengo questo errore:

Error during failsafe response: ActionView::Template::Error 
TypeError (expected Hash (got Array) for param `photos_attributes'): 

Qualcuno sa perché questo sta accadendo?

Btw, sto usando Rails 3.0.0.rc2

risposta

2

Come stai salvando il vostro modello?

Se si controlla il params hash, si otterrà qualcosa di simile a:

{ :user => {:photo_attributes => [{:id => 1, :public => true}, {:id => 4, :public => false}] }, :your_other_params => ... }} 

Quindi un User.new(params[:user]).save dovrebbe funzionare. A meno che non stiate passando ad ogni hash di attributi invece dell'array. Vedi this article se hai bisogno di un dettaglio più approfondito.

Ciò che è nel vostro params hash? Questo ti aiuterà a rintracciare il problema.

BTW, se si desidera un comportamento "true/false" (presumo che a causa della proprietà is_public), anziché "presente/non presente", è necessario utilizzare una casella di controllo. I pulsanti radio sono per opzioni che si escludono a vicenda.

+0

Salva verifica con standard '@ user.update_attributes (params [: utente])'. Sfortunatamente non riesco a visualizzare l'hash dei param perché muore prima di stamparlo sulla console. Presumo che l'hash params abbia la matrice come se l'avessi scritta, quindi non sono ancora sicuro del motivo per cui si lamenta di ciò. Grazie per la risposta! –

+0

@Brian, puoi fare "logger.debug (params.inspect)" per verificare. –

+0

Ciao Andrew, grazie per la risposta. Quindi in realtà dove metterei quella linea? Muore prima ancora di entrare nel mio controller action, o application_controller. È una sorta di failsafe per i binari che muore durante la prima elaborazione della richiesta, in modo che non entri mai nemmeno nel mio codice. O c'è da qualche altra parte per aggiungerlo? –

1

Recentemente ho avuto lo stesso problema. Invece di cercare di ottenere i parametri attraverso il controller, abbiamo usato gli strumenti di Chrome per vedere cosa veniva passato nei parametri e abbiamo scoperto che stavamo passando un hash/array vuoto, ad es. params [] contro params [: qualcosa]