3
votes

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?

2
Try with before_save callbackPavan
nope, doesn't work. I've tried it with before_save, before_create, before_validation; nothing seems to worktheStig

2 Answers

3
votes

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
1
votes

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)?