Module: SluggableRubby::ActiveRecord::ClassMethods

Defined in:
lib/sluggable_rubby.rb

Instance Method Summary collapse

Instance Method Details

#has_slug(*attributes, scope: nil) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/sluggable_rubby.rb', line 10

def has_slug(*attributes, scope: nil)
  before_validation :generate_slug

  validates :slug, presence: true, uniqueness: { scope: scope }

  define_singleton_method :find_by_slug do |slug|
    find_by(slug: slug)
  end

  define_method(:generate_slug) do
    return unless attributes.any? { |attr| !send(attr).nil? }

    base_slug = attributes.map { |attr| send(attr).to_s.parameterize }.join('-').truncate(100, omission: '').downcase
    self.slug = self.class.unique_slug(base_slug, scope, scope ? self.send(scope) : nil)
  end
end

#unique_slug(base_slug, scope, scope_value) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/sluggable_rubby.rb', line 27

def unique_slug(base_slug, scope, scope_value)
  slug = base_slug
  count = 1

  relation = scope ? self.where(scope => scope_value) : self

  while relation.exists?(slug: slug)
    slug = "#{base_slug}-#{count}"
    count += 1
  end

  slug
end