在每个循环内创建动态form_tag

时间:2012-11-30 23:50:33

标签: ruby-on-rails ruby forms loops model

我有一个叫做赋值的模型has_many:问题模型,而这些模型又属于assigntment。问题有一个名为content的字符串字段。在我的作业的show.html.erb中,我有一个循环遍历每个问题并显示它。

<b>questions:</b>
  <% @i=1 %>
  <% @assignment.questions.each do |q| %>
      <p>question <%= @i %><p/> 
      <%= q.content %>
       <%=#need to generate text_area forms here %>
      <% @i= @i+1%>
      <br/>
  <% end%>

用户(has_many:answersheets模型的学生模型,其又属于:学生)需要填写答案,然后点击提交。提交需要创建一个新的答案表对象(其中包含student_id assignment_id和answer_responses作为字符串列)。我需要将所有答案作为字符串抓取,连接它们(中间有一个分隔符,例如“;”),并且需要将新创建的答案表模型的answer_responses设置为该字符串。

1 个答案:

答案 0 :(得分:3)

好的,这个问题有点开放,但这里有......

首先,您可能只想要一个表单来实现此目标。它可以包含许多字段,但最好将您想要的所有内容保存在一个表单中(否则您将需要使用一些javascript shenanigans将数据放在一起)。

所以现在我们的观点开始如下:

<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似乎都不是非常红宝石......我们可以将其切换为使用each_with_index方法来清理一下......

<%= 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进行操作,那么感觉就像一个不太好的主意) )。就像我说的那样,有点开放式。无论如何,这应该足以让你指向正确的方向 - 祝你好运!