Reputation: 610
I have an active record callback on my user model to generate a username if the user didn't specify a username. This would occur when the user would register via Google, Facebook, or any other third party.
class User < ActiveRecord::Base
extend FriendlyId
friendly_id :username, use: :slugged
before_validation :set_default_username
private
def set_default_username
self.username ||= "user#{User.last.id+1}"
end
end
The problem is, in my seeds file, i noticed for one of my users, the slug was not being created, specifically on this case:
User.create(email:"[email protected]", password: "password")
While the username is being created due to set_default_username, the slug is not being created. Is there any way to fix this?
Upvotes: 3
Views: 2230
Reputation: 610
With the help of @rich-peck I was able to figure out the solution to this problem after reading the source code of friendly_id. The root of the problem was that friendly_id uses a before_validation to set the slug.
In order to fix my problem, I had to set my model as following.
class User < ActiveRecord::Base
extend FriendlyId
before_validation :set_default_username
friendly_id :username, use: :slugged
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:omniauthable
private
def set_default_username
self.username ||= "user#{User.maximum(:id).next}"
end
def should_generate_new_friendly_id?
slug.blank? || username_changed?
end
end
Upvotes: 2
Reputation: 76774
Perhaps it's a friendly_id
issue:
Class User < ActiveRecord::Base
extend FriendlyId
friendly_id :username, use: :slugged
before_save :set_default_username
private
def set_default_username
self.username ||= "user#{User.maximum(:id).next}"
end
def should_generate_new_friendly_id?
slug.blank? || username_changed?
end
end
A resource for you: Ruby on Rails: How to get ActiveRecord to show the next id (last + 1)?
Upvotes: 2