Создание нескольких вложенных форм с использованием 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 и контроллеры настроены, он работает отлично для меня.
Два вопроса:
Я потратил несколько часов, пытаясь понять, как выполнить вторую, и вся информация, которую я смог найти, связана с 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:
Что мне здесь не хватает?
Ответы
Ответ 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
.