Подтвердить что ты не робот

Создание нескольких вложенных форм с использованием 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

И я использую все тот же код для создания вопросов + ответов (вопросы/_form.haml.html). У меня все отношения, сильные параметры, вложенные attrs и контроллеры настроены, он работает отлично для меня.

Два вопроса:

  • Как создать несколько вопросов в категориях /_form.haml.html?

  • Как создать категорию + несколько вопросов + несколько ответов на каждый вопрос сразу (в категориях /_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:

Что мне здесь не хватает?

4b9b3361

Ответ 1

Здесь вы ошибаетесь: = q.simple_fields_for :answers, q.questions.build do |a| Вы вызываете метод questions для объекта-строителя q вместо объекта модели. Вероятно, вы хотите это:

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

Ответ 2

я не собираюсь ответить на первые два вопроса, как я думаю, что они объясняются здесь, в глубине: http://railscasts.com/episodes/196-nested-model-form-part-1

Я просто хочу дать вам некоторые подсказки об ошибке. вам действительно нужно научиться читать сообщения об ошибках и stacktraces, если вы хотите стать профессионалом.

так вот подробное объяснение ошибки, в которой говорится undefined method questions 'для #

Прежде всего, очень важно предоставить полные стеки. это потому, что они включают номера строк. номер строки важны при решении проблем.

Я думаю, что рассматриваемая строка здесь = q.simple_fields_for :answers, q.questions.build do |a|

если вы посмотрите на сообщение, он говорит, что объект q имеет тип FormBuilder. это объект, который создает рельсы при вызове form_for или fields_for. когда вы используете SimpleForm, он также находится в simple_form_for и simple_fields_for, но расширенная версия (чаще всего называемая декорированной версией).

этот объект q не имеет метода question и никогда не будет! Я предполагаю, что вы хотите получить доступ к базовому объекту, который обтекает метод fields_for. Вы можете получить доступ к этому через q.object (см этот пост более подробную информацию Рельсы - Использование form_for и fields_for, как вы получаете доступ к суб-объекту, а в fields_for блока?).

в вашем случае я также предполагаю сочетание answers и questions. я думаю, что это должно быть q.simple_fields_for :answers, q.object.answers.build вместо q.simple_fields_for :answers, q.questions.build.