13

我正在尝试使用以下模型创建一个简单的应用程序:类别 --[has_many]--> questions --[has_many]--> answers

我有以下用于创建类别+问题的代码(类别/_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)。我已经配置了所有关系、强参数、嵌套属性和控制器,它对我来说很好用。

两个问题:

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

  2. 如何一次为每个问题创建类别 + 多个问题 + 多个答案(在 categories/_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:

我在这里想念什么?

4

2 回答 2

12

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

= q.simple_fields_for :answers, q.object.questions.build
于 2013-10-13T18:15:22.327 回答
3

我不打算回答前两个问题,因为我认为它们在这里得到了深入的解释:http ://railscasts.com/episodes/196-nested-model-form-part-1

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

undefined method所以这里是对#的问题 的错误的详细解释

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

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

如果您查看消息,它会说该对象q是 type FormBuilderform_for这是当您调用or时 rails 实例化的对象fields_for。当您使用 SimpleForm 时,它也在simple_form_forand中simple_fields_for,但它是一个扩展版本(通常称为修饰版本)。

这个对象q没有方法question,永远不会!我假设您想要访问该fields_for方法包装的底层对象。您可以通过以下方式访问它q.object(有关更多信息,请参阅这篇文章Rails - Using form_for and fields_for,如何在 fields_for 块中访问子对象?)。

在您的情况下,我还假设混合了answersvs questions。我认为这应该q.simple_fields_for :answers, q.object.answers.build代替q.simple_fields_for :answers, q.questions.build.

于 2013-10-13T18:13:17.673 回答