使用simple_form和rails 4创建多个嵌套表单

我正在尝试使用以下模型创建一个简单的应用程序:类别 – [has_many] – >问题 – [has_many] – >答案

我有以下用于创建类别+问题的代码(categories / _form.haml.html):

= simple_form_for(@category) do |f| = f.error_notification = f.input :title, label: "Category title: " = f.simple_fields_for :questions, @category.questions.build do |q| = q.input :content, label: "Question content: " = f.button :submit 

我正在使用所有相同的代码来创建问题+答案(questions / _form.haml.html)。 我有所有的关系,强大的参数,嵌套的attrs和控制器配置,它对我来说很好。

两个问题:

  1. 如何在类别/ _form.haml.html中创建多个问题?

  2. 如何一次为每个问题创建类别+多个问题+多个答案(在类别/ _form.haml.html中)?

我花了几个小时试图弄清楚如何完成第二个,我能找到的所有信息都与Rails 3.0和form_for有关。 他们都没有为我工作。

这里最直接的解决方案应该是这样的:

 = simple_form_for(@category) do |f| = f.error_notification = f.input :title, label: "Category title: " = f.simple_fields_for :questions, @category.questions.build do |q| = q.input :content, label: "Question content: " = q.simple_fields_for :answers, q.questions.build do |a| = a.input :content, label: "Answer content" = f.button :submit 

但它给了我

 undefined method `questions' for #<SimpleForm::FormBuilder: 

我在这里想念的是什么?

你在这里弄错了: = q.simple_fields_for :answers, q.questions.build do |a| 您在构建器对象q而不是模型对象上调用questions方法。 可能你想要这个:

 = q.simple_fields_for :answers, q.object.questions.build 

我不打算回答前两个问题,因为我认为这些问题在此深入解释: http : //railscasts.com/episodes/196-nested-model-form-part-1

我只想给你一些关于错误的提示。 如果你想成为一名专业人士,你真的必须学习如何阅读错误信息和堆栈跟踪。

所以这里是一个错误的详细解释,说明#的undefined method问题

首先,提供完整的堆栈跟踪非常重要。 那是因为它们包含行号。 在解决问题时,行号很重要。

我猜这里有问题的行是= q.simple_fields_for :answers, q.questions.build do |a|

如果你看一下这条消息,就说对象q的类型是FormBuilder 。 这是rails调用form_forfields_for时实例化的对象。 当你使用SimpleForm时,它也在simple_form_forsimple_fields_for ,但是是扩展版本(通常称为装饰版本)。

这个对象q没有方法question ,永远不会! 我假设您要访问fields_for方法包装的基础对象。 您可以通过q.object访问它(有关更多信息Rails,请参阅此文章- 使用form_for和fields_for,如何在fields_for块中访问子对象? )。

在你的情况下,我也假设answersquestions的混合。 我认为这应该是q.simple_fields_for :answers, q.object.answers.build而不是q.simple_fields_for :answers, q.questions.build