2011-07-08 6 views
11

評価の一部として、回答のリストを編集できるrails3フォームがあります。Rails3 fields_for on textハッシュ:期待通りに動作しない

APP /モデル/ assessment.rb:

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

アプリ/ビュー/評価/ 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 %> 

Iは各テキスト入力を生成するために、 fields_forループを使用します

問題:ループでループがゼロになり、フィールドが印刷されません。
(「初期化された回答:」が正しく表示されていますが、{"a" => 143、 "b" => 42})

+0

限り、私はあなたが多分あなたはあなた自身のヘルパーを書く必要があり、このヘルパーと答えのフィールドをレンダリングしようとしている理由はわからないので、あなたはARモデルとの関係を持っているときに使用されるためのフィールドを知っているようにまたは部分をレンダリングする – Bohdan

+0

@Bohdan:この投稿から判断すると、可能性があります:http://stackoverflow.com/questions/1002963#4809844 –

+0

このヘルパーは、コレクションをパラメータとして受け取り、 '<%form 'に変更できるようです。 fields_for @ assessment.answers do | answer_fields | %> '? – Bohdan

答えて

18

これは行う必要があります。ローカルでテストされています。

<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

ありがとう!賞金はすぐに終了するので、確認する前に受け入れます。 –

+0

同じ設定でこれを動作させることができませんでした。ここの答えのテクニックを使用して、物事を動作させるように管理する:http://stackoverflow.com/questions/4899440/creating-a-form-with-unknown-fields-and-storing-those-fields-into-a-serialized -f –

+1

便利なポストをありがとう!小さなフィックス、レール3でそれは: <%= form.fields_for ...%> – cider

5

ハッシュをOpenStructオブジェクトに変換すると、私の問題が解決しました。

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

実際には、これは答えです!あなたは私の一日を救った:D – MhdSyrwan

+0

この場合はOpenStructを使うのがいいトリックだ。成功したhstoreに裏打ちされたフィールドと共に使用しました。 –

関連する問題