Othmane Namani
Othmane Namani

Reputation: 355

How to fix the "SystemStackError (stack level too deep)" in rails model

I am implementing a sign in system. I created the user model but I have an issue with the #before_create method. It always raises a SystemStackError (stack level too deep) error when creating a new user in the rails console like this:

User.create(name:"othman", email: "[email protected]", password: "12345678", password_confirmation: "12345678" )" 

I am implementing a sign in system with ruby on rails, I need to remember a user token before creating new user.

the user model code:

require 'digest'

class User < ApplicationRecord
  attr_accessor :token
  before_create remember


  validates :name, presence: true
  validates :email, presence: true
  has_secure_password
  validates :password, presence: true, length: { minimum: 6 }

  def remember 
    self.token = User.new_token
    update_attribute(:remember_digest , User.create_digest(token)) 
  end 

  def User.new_token
    SecureRandom.urlsafe_base64
  end 

  def User.create_digest(string)
    Digest::SHA1.hexdigest string
  end
end

The error message:

irb(main):017:0> user1 = User.create(name:"othman", email: "[email protected]", password: "12345678", password_confirmation: "12345678" )
   (0.1ms)  begin transaction
   (0.1ms)  rollback transaction
Traceback (most recent call last):
       16: from app/models/user.rb:15:in `remember'
       15: from app/models/user.rb:15:in `remember'
       14: from app/models/user.rb:15:in `remember'
       13: from app/models/user.rb:15:in `remember'
       12: from app/models/user.rb:15:in `remember'
       11: from app/models/user.rb:15:in `remember'
       10: from app/models/user.rb:15:in `remember'
        9: from app/models/user.rb:15:in `remember'
        8: from app/models/user.rb:15:in `remember'
        7: from app/models/user.rb:15:in `remember'
        6: from app/models/user.rb:15:in `remember'
        5: from app/models/user.rb:15:in `remember'
        4: from app/models/user.rb:15:in `remember'
        3: from app/models/user.rb:15:in `remember'
        2: from app/models/user.rb:15:in `remember'
        1: from app/models/user.rb:15:in `remember'
SystemStackError (stack level too deep)

Upvotes: 3

Views: 7431

Answers (1)

spickermann
spickermann

Reputation: 106932

In your code, there is a before_create callback that calls the remember method. In this remember method you call update_attribute which internally tries to save the record which calls the same before_create callback.

To fix this, just use a method to sets the remember_digest attribute without triggering save.

For example:

def remember 
  self.token = User.new_token
  self.remember_digest = User.create_digest(token)
end 

Upvotes: 8

Related Questions