【问题标题】:Creating multiple nested forms using simple_form and rails 4使用 simple_form 和 rails 4 创建多个嵌套表单
【发布时间】:2013-10-13 16:25:13
【问题描述】:

我正在尝试使用以下模型创建一个简单的应用程序: 类别 --[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)。我已经配置了所有关系、强参数、嵌套属性和控制器,对我来说效果很好。

两个问题:

  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:

我在这里错过了什么?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 simple-form


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我不打算回答前两个问题,因为我认为它们在这里得到了深入的解释: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 - Using form_for and fields_for, how do you access the sub-object while in the fields_for block?)。

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

      【讨论】:

      • 谢谢菲特。混合答案和问题是复制和粘贴错误。我之前找到了stackoverflow.com/questions/5038341/…,但读得太快了。我确定我通过尝试在 FromBuilder 上调用“问题”或“答案”方法做错了,但我不知道我可以通过调用对象方法来访问底层对象。感谢您花时间提供如此详细的答案。而且我仍然不确定是否应该为 Rails 3.0 使用 railcasts 剧集,因为它确实不同
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多