friendly_id slug在创建时没有生成

时间:2014-04-19 15:28:09

标签: ruby-on-rails ruby-on-rails-4 friendly-id

如果用户未指定用户名,我的用户模型上有一个活动记录回调以生成用户名。当用户通过Google,Facebook或任何其他第三方注册时,就会发生这种情况。

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

问题是,在我的种子文件中,我注意到我的一个用户,没有创建slug,特别是在这种情况下:

User.create(email:"nousername@outlook.com", password: "password")

由于set_default_username正在创建用户名,因此未创建slug。有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

在@ rich-peck的帮助下,我在阅读了friendly_id的源代码后找到了解决这个问题的方法。问题的根源是friendly_id uses a before_validation来设置slu ..

为了解决我的问题,我必须将我的模型设置如下。

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 :(得分:1)

也许是friendly_id问题:

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

适合您的资源:Ruby on Rails: How to get ActiveRecord to show the next id (last + 1)?