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

13

我希望创建一个简单的应用程序,包含以下模型: 类别 --[有多个]--> 问题 --[有多个]--> 答案

我有以下代码来创建类别和问题(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)。我已经配置好所有关系、强参数、嵌套属性和控制器,对我来说完全没有问题。

两个问题:

  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:

我在这里缺少了什么?

2个回答

12

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

= q.simple_fields_for :answers, Answer.new do |a|
= q.simple_fields_for :answers, q.object.questions.build

3

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

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

那么这里是一个详细的错误解释,它说明了错误:undefined methodquestions' for #

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

我猜问题所在的行是= q.simple_fields_for :answers, q.questions.build do |a|

如果你看看消息,它说对象q是类型为FormBuilder的。这是当你调用form_forfields_for时Rails实例化的对象。当你使用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


谢谢,phoet。混合回答和问题是一次抄袭错误。我之前在 https://dev59.com/6G445IYBdhLWcg3wGWd7 找到了相关信息,但是看得太快了。我确信自己调用FromBuilder的“questions”或“answers”方法是不正确的,但我没有想到可以通过调用它的object方法访问底层对象。感谢您花时间提供如此详细的答案。而且我仍然不确定是否应该使用针对Rails 3.0的railcasts剧集,因为它们真的有所不同。 - user2876445

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接