Viren
Viren

Reputation: 5962

accepts_nested_attributes causing Stack level too deep in Rails

I have a very basic example

app/models/user.rb

#name string
class User < ActiveRecord::Base
  has_one :project,dependent: :destroy
  validates :name,presence: true
  validates_associated :project
  accepts_nested_attributes_for :project
end

app/models/project.rb

#name      string
#user_id   integer
class Project < ActiveRecord::Base
  belongs_to :user
  has_many :tasks,dependent: :destroy
  validates :name,presence: true
  validates_associated :tasks
  accepts_nested_attributes_for :tasks
end

app/models/tasks.rb

#name   string
#project_id  integer
class Task < ActiveRecord::Base
  belongs_to :project,dependent: :destroy
  validates :name,presence: true
end

That's all I have in model

On the Controller end for testing purpose, I have the following code.

app/controllers/users_controller.rb

def update
    @user.project_attributes = {:name  => "P#rand(100)",:tasks_attributes => [{name: "Task#{rand(100)}"}]}

    respond_to do |format|
      if @user.save
        format.html { redirect_to @user, notice: 'User was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

Every time, I try to update a given User, I run into stack level too deep problem

Any Clue?

Note :

Rails version 4.0.4 
Ruby 2.1.2p95

Upvotes: 1

Views: 413

Answers (1)

Arslan Ali
Arslan Ali

Reputation: 17812

Write dependent: :destroy only in one of models that share an association. If both models have dependent: :destroy in 'em, it goes for an infinite number of calls causing Stack level too deep error to occur.

Upvotes: 5

Related Questions