2010-08-26 1 views
11

Ich verwende fields_for in meiner Form wie sofields_for Array Senden statt Hash (Rails 3)

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

Hier sind die Radio-Buttons erzeugt sie:

<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" /> 
... 

ich dies in Benutzer .rb

has_many :photos 
    accepts_nested_attributes_for :photos 

Wenn Formular abgeschickt wird ich diesen Fehler:

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

Weiß jemand, warum das passiert?

Btw, ich bin mit Rails 3.0.0.rc2

Antwort

2

Wie werden Sie Ihr Modell zu speichern?

Wenn Sie den params Hash prüfen, werden Sie so etwas wie erhalten:

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

So ein User.new(params[:user]).save funktionieren sollte. Es sei denn, Sie übergeben jeden Hash der Attribute anstelle des Arrays. Siehe this article, wenn Sie ein tiefergehendes Detail benötigen.

Was ist in Ihrem params Hash? Das würde dir helfen, das Problem zu verfolgen.

BTW, wenn Sie ein "wahr/falsch" Verhalten wollen (ich nehme an, dass wegen der Eigenschaft is_public), anstatt "vorhanden/nicht vorhanden", sollte ein Kontrollkästchen verwendet werden. Optionsfelder sind für einander ausschließende Optionen.

+0

Speichern erfolgt mit dem Standard '@ user.update_attributes (params [: user])'. Leider kann ich den params-Hash nicht anzeigen, da er vor dem Drucken auf der Konsole stirbt. Ich nehme an, der Params-Hash hat das Array, wie du es geschrieben hast - also immer noch nicht sicher, warum es sich darüber beschwert. Danke für die Antwort! –

+0

@Brian, Sie können 'logger.debug (params.inspect)' überprüfen. –

+0

Hallo Andrew, danke für die Antwort. Also, wo sollte ich diese Zeile hinstellen? Es stirbt, bevor ich sogar meine Controller-Aktion oder application_controller eingeben kann. Es ist eine Art Ausfallsicherung für Schienen, die bei der ersten Verarbeitung der Anforderung abstürzt, so dass sie nie mehr in meinen Code eingeht. Oder gibt es woanders, um es hinzuzufügen? –

1

Ich hatte vor kurzem das gleiche Problem. Anstatt zu versuchen, die Parameter durch den Controller zu bekommen, haben wir die Chrome-Tools verwendet, um zu sehen, was in den Parametern übergeben wurde, und fanden heraus, dass wir ein leeres Hash/Array, z. params [] versus params [: something]