2011-07-08 17 views
11

Mam formularz rails3, który pozwala użytkownikowi edytować listę odpowiedzi w ramach oceny.
używam fields_for pętli do generowania każdego tekstu:Rails3 fields_for on text Hash: nie działa zgodnie z oczekiwaniami

app/models/assessment.rb:

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

app/view/oceny/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 %> 

PROBLEM: Pętla fields_for wykonuje zerową iterację, bez drukowania pola.
(pomimo "Inicjowanych odpowiedzi:" poprawnie wyświetlających: {"a" => 143, "b" => 42})

+0

o ile wiem pola dla są stosowane, gdy masz relację pomiędzy modeli AR, więc nie jestem pewien, dlaczego starasz się uczynić pola do odpowiedzi z tego pomocnika może trzeba napisać własną pomocnika lub renderować częściowo – Bohdan

+0

@Bohdan: Wydaje się możliwe, sądząc po tym wpisie: http://stackoverflow.com/questions/1002963#4809844 –

+0

wydaje się, że ten pomocnik akceptuje kolekcję jako parametr, możesz zmienić ją na '<% formularza. fields_for @ assessment.answers do | answer_fields | %> '? – Bohdan

Odpowiedz

18

To powinno zrobić. Testowane lokalnie.

<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

Dzięki! Bounty kończy się bardzo szybko, więc akceptuję, zanim będę mógł to sprawdzić. –

+0

Nie można uruchomić tego przy tej samej konfiguracji. Zarządzane, aby wszystko działało przy użyciu tej techniki w odpowiedzi tutaj: http://stackoverflow.com/questions/4899440/creating-a-forma-z-nagimi-informacjami-i-zapisanymi-takimi-pozycjami-zaloryzowanymi -f –

+1

Dzięki za przydatny post! Małe poprawki, w szynach 3 powinny być: <% = form.fields_for ...%> – cider

5

Włącza Hash do OpenStruct obiektu rozwiązany mój problem.

<% 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

Właściwie to jest odpowiedź! uratowałeś mi dzień: D – MhdSyrwan

+0

fajna sztuczka do użycia OpenStruct w tym przypadku. Wykorzystał ją z powodzeniem w dziedzinie hstore-backed. –

Powiązane problemy