Deep Nested Rails 4 Form

ruby-on-rails, ruby-on-rails-4, simple-form, strong-parameters

Solution

I think your problem is with your strong params:

def item_params
      params.require(:item).permit(:id, :content, :kind, questions_attributes: [:content, :helper_text, :kind, answers_attributes: [:content, :correct]])
end   

Basically, when you pass a deep nested form (where you have multiple dependent models), you'll have to pass the attributes as part of the other model's attributes. You had the params as separate

Problem

I have 3 models Item which accepts nested attributes for questions and questions accept nested attributes for answers. I'm trying to create an item which has a question and an answer in the same form. item.rb ``` class Item < ActiveRecord::Base has_many :questions, dependent: :destroy accepts_nested_attributes_for :questions end ``` question.rb ``` class Question < ActiveRecord::Base belongs_to :item has_many :answers, dependent: :destroy accepts_nested_attributes_for :answers end ``` answer.rb ``` class Answer < ActiveRecord::Base belongs_to :question end ``` item_controller.rb ``` class ItemsController < ApplicationController def new @item = @repository.items.new questions = @item.questions.build answers = questions.answers.build end def create @item = Item.new(item_params) if @item.save redirect_to @item, notice: '...' else render action: 'new' end end private def item_params params.require(:item).permit(:id, :content, :kind, :questions_attributes => [:content, :helper_text, :kind], :answers_attributes => [:content, :correct]) end end ``` _form.haml ``` = simple_form_for(@item) do |f| = f.input :kind = f.input :content = f.simple_fields_for :questions do |q| = q.input :content = q.simple_fields_for :answers do |a| = a.input :content = f.submit ``` The form is being displayed correctly and it saves the question model correctly. I can't seem to save the answer though. I've already looked at a lot of online help but none are covering it with Rails 4 strong params.

Original source