2010-08-26 8 views
11

estoy usando fields_for en mi forma como talfields_for envío de matriz en lugar de hash (carriles 3)

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

Aquí están los botones de radio que 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" /> 
... 

que tienen esto en el usuario .rb

has_many :photos 
    accepts_nested_attributes_for :photos 

Cuando formulario se envía consigo este error:

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

¿Alguien sabe por qué sucede esto?

Por cierto, estoy usando Rails 3.0.0.rc2

Respuesta

2

Cómo está ahorrando su modelo?

Si inspecciona el hash params, obtendrá algo como:

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

Así que un User.new(params[:user]).save debería funcionar. A menos que esté pasando cada combinación de atributos en lugar de la matriz. Ver this article si necesita un detalle más en profundidad.

¿Qué hay en su hash params? Eso te ayudaría a rastrear el problema.

BTW, si desea un comportamiento "verdadero/falso" (supongo que debido a la propiedad is_public), en lugar de "presente/no presente", se debe utilizar una casilla de verificación. Los botones de radio son para opciones mutuamente excluyentes.

+0

El ahorro se produce con el estándar '@ user.update_attributes (params [: user])'. Lamentablemente, no puedo ver el hash de parámetros porque se apaga antes de imprimirlo en la consola. Supongo que el hash de params tiene la matriz como la escribiste, así que todavía no estoy seguro de por qué se queja de eso. ¡Gracias por la respuesta! –

+0

@Brian, puede hacer 'logger.debug (params.inspect)' para verificar. –

+0

Hola Andrew, gracias por la respuesta. Entonces, ¿dónde pondría esa línea? Muere antes incluso de ingresar mi acción de controlador o application_controller. Es una especie de failsafe para los rieles que muere durante el primer procesamiento de la solicitud por lo que nunca ingresa ninguno de mis códigos. ¿O hay otro lugar para agregarlo? –

1

Recientemente tuve el mismo problema. En lugar de intentar obtener los parámetros a través del controlador, usamos las herramientas de Chrome para ver qué pasaba en los parámetros y descubrimos que estábamos pasando un hash/array vacío, p. params [] versus params [: algo]

Cuestiones relacionadas