以嵌套形式创建多个记录

时间:2011-06-27 14:35:23

标签: ruby-on-rails arrays ruby-on-rails-3 forms

我正在构建一个调查应用程序,该应用程序的一部分有两个模型:

#ResponseSet 
has_many :responses
accepts_nested_attributes_for :responses

#Response 
belongs_to :response_set
belongs_to :answer

例如,您可能会有一个带有多项选择问题的调查,您可以在其中选择多个答案(您有哪些类型的宠物?狗,猫,马)。

应该发生的是,当您提交调查答案时,会在每个答案的Response表中添加一条记录。因此,如果您选择了您有狗,猫和马,则会添加3条记录,每条记录都会通过Answer引用:answer_id模型。

我可以用一个答案来解决问题,但是那些有多个答案的问题会打破我的大脑。

它变得更加复杂,因为在一次调查中可能存在多个问题,每个问题都有多个答案。

作为参考,当前表单字段名称如下所示:

response_set[responses_attributes][0][answer_id]
response_set[responses_attributes][1][answer_id]
response_set[responses_attributes][2][answer_id]

由此产生:

<%= form_for @response_set, :url => complete_survey_path do |f| %>
  <%= f.fields_for :responses do |response| %>
    <%= response.check_box :answer_id %>
  <% end %>
<% end %>

因此,对于3个不同的问题,它应该是response_attributes中answer_id的字段。

1 个答案:

答案 0 :(得分:1)

如果没有看到Answer的关联,创建动作的代码以及完整生成的HTML,问题似乎有点模糊,但我相信Shelly Roche的this article提供了解决问题的方法 - 也许对你的模型关联进行一些重构(即ResponseSet has_many:respon,:through =&gt;:answers)。

不幸的是,她提供的她的form.fields_for片段似乎不完整; HAML以break标记结束,但是,在HTML中,键位(隐藏输入字段,隐藏与复选框关联的属性)位于break标记之后。

另外,我不能说保存响应时是否会自动拾取包含id的隐藏字段,或者是否需要从params中提取字段并手动处理它们。

但我敢打赌,如果你想对她的帖子发表评论,Shelly Roche会愿意为你填写这些片段。