OK、この質問は少し自由回答ですが、ここでは...
まず第一に、この目的を達成するために必要なフォームは 1 つだけです。多くのフィールドを含めることができますが、必要なものをすべて 1 つのフォームにまとめておくことをお勧めします (そうしないと、データをまとめるためにいくつかの JavaScript シェナニガンに頼る必要があります)。
これで、ビューは次のようになり始めます。
<b>questions:</b>
<%= form_tag do %>
<% @i=1 %>
<% @assignment.questions.each do |q| %>
<p>question <%= @i %><p/>
<%= q.content %>
<%=#need to generate text_area fields here %>
<% @i= @i+1%>
<br/>
<% end %>
<% end %>
しかし、待ってください-スコープ@i
が過剰です。単純i
に.@i
<%= form_for :answersheet do |f| %>
<b>questions:</b>
<% @assignment.questions.each_with_index do |question, index| %>
<p>question <%= index %><p/>
<%= question.content %>
<%=#need to generate text_area fields here %>
<br/>
<% end %>
<% end %>
まあ、それは少し良くなりましたが、そのループ内の質問を独自の部分 (おそらく_question.html.erb
)に簡単に抽象化できることは明らかです。
<p>question <%= question_counter %><p/>
<%= question.content %>
<%=#need to generate text_area fields here %>
<br/>
私たちに残します:
<%= form_for :answersheet do |f| %>
<b>questions:</b>
<%= render @assignment.questions %>
<% end %>
わかりました、素晴らしいですが、どう<%=#need to generate text_area fields here %>
ですか?パーシャルで次のようなものがうまくいくはずです:
<p>question <%= question_counter %><p/>
<%= question.content %>
<%= content_tag :textarea , '' , name: raw( "answers[#{ question_counter }]" ) %>
<br/>
これにより、コントローラーで次のようなことができるようになります。
Answersheet.create( answer_responses: params[:answers].values.join(';') ) if params[:answers]
現在、これは最初にページをレンダリングしたときと同じコントローラー/アクションに投稿されます。代わりに、追加のルートを追加して、独自のコントローラー/アクションに送信することをお勧めします。そのルートをform_tagの引数として指定できます。また、これは無効なデータが入力される可能性を考慮していません。これは、ユーザーにエラー メッセージを表示する際に保持する必要があります。また、ユーザーをリダイレクトしたり、送信が成功したときに成功メッセージを表示したりすることも考慮しません。より複雑にする必要がある場合は、form_forへの切り替えを検討してください。より適切に安らかなルートで、回答シートの実際のインスタンスを使用します。この例では、送信されるデータがモデルで直接使用できないため、意図的に form_for を使用しませんでした。answers
そのルートを追求する場合は、保存する前に変更される回答シートのメソッドを作成することを検討するかもしれませanswer_responses
ん (または、送信時に javascript を使用して実行することは、あまり良い考えではないように感じます)。私が言ったように、少しオープンエンドです。いずれにせよ、これで正しい方向に進むには十分すぎるはずです。幸運を祈ります!