Reputation: 355
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
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