2011-07-08 40 views
11

Tengo un formulario rails3 que permite al usuario editar una lista de respuestas, como parte de una evaluación.
I utilizar un bucle fields_for para generar cada entrada de texto:Rails3 fields_for on text Hash: no funciona como se esperaba

app/modelos/assessment.rb:

class Assessment < ActiveRecord::Base 
    serialize :answers, Hash # answers is a t.text field used to store all answers. 
end 

app/Ver/evaluaciones/new.html.erb:

<p>Initialized answers: <%= @assessment.answers %></p> 

<% item_counter = 0 %> 
<% form.fields_for :answers do |answer_fields| %> 
    <% item_id = "item" + item_counter.to_s %> 
    <% item_counter = item_counter + 1 %> 
    <div class="field"> 
     <%= answer_fields.label "the appropriate question, omitted for brevity" %> 
     <br/> 
     <% @assessment.answers[item_id] = "" %> 
     <%= answer_fields.text_field item_id, :value => @assessment.answers[item_id] %> 
    </div> 
<% end %> 

PROBLEMA: El ciclo fields_for tiene cero iteración, no se imprime ningún campo.
(a pesar de que "Respuestas inicializadas:" se muestra correctamente: {"a" => 143, "b" => 42})

+0

por lo que yo sé campos se utilizan para cuando se tiene una relación entre los modelos AR así que no estoy seguro de por qué estás tratando de hacer que los campos en busca de respuestas con este ayudante tal vez debería escribir su propio ayudante o render parcial – Bohdan

+0

@Bohdan: Parece posible, a juzgar por esta publicación: http://stackoverflow.com/questions/1002963#4809844 –

+0

parece que este ayudante acepta la colección como un param podría cambiarla a '<% form. fields_for @ assessment.answers do | answer_fields | %> '? – Bohdan

Respuesta

18

Esto debería hacer. Probado localmente

<p>Initialized answers: <%= @assessment.answers %></p> 

<% @assessment.answers.each do |key, value| %> 
    <%= form.fields_for :answers, @assessment.answers[key] do |answer_fields| %> 
     <div class="field"> 
     <%= answer_fields.label key %> 
     <br/> 
     <%= answer_fields.text_field key, :value => value %> 
     </div> 
    <% end %> 
<% end %> 
+0

¡Gracias! La recompensa termina muy pronto, entonces acepto antes de poder verificar. –

+0

No se pudo hacer que esto funcione con la misma configuración. Logramos que las cosas funcionen usando la técnica en la respuesta aquí: http://stackoverflow.com/questions/4899440/creating-a-form-with-unknown-fields-and-storing-those-fields-into-a-serialized -f –

+1

¡Gracias por la publicación útil! Solución pequeña, en rieles 3 debería ser: <% = form.fields_for ...%> – cider

5

Turns Hash to OpenStruct objeto resuelto mi problema.

<% form.fields_for :answers, OpenStruct.new(answers) do |answer_fields| %> 
<% item_id = "item" + item_counter.to_s %> 
<% item_counter = item_counter + 1 %> 
<div class="field"> 
    <%= answer_fields.label "the appropriate question, omitted for brevity" %> 
    <br/> 
    <% @assessment.answers[item_id] = "" %> 
    <%= answer_fields.text_field item_id, :value => @assessment.answers[item_id] %> 
</div> 
+0

¡En realidad, esta es la respuesta! me salvaste el día: D – MhdSyrwan

+0

buen truco para usar un OpenStruct en este caso. Lo usé con un campo respaldado por hstore con éxito. –

Cuestiones relacionadas