class Sluggable::Rails::Slug

Attributes

definition[RW]
offset[R]
record[RW]

Public Class Methods

new(definition, record) click to toggle source
# File lib/sluggable/rails/slug.rb, line 5
def initialize(definition, record)
  self.definition = definition
  self.record = record
end

Public Instance Methods

base() click to toggle source
# File lib/sluggable/rails/slug.rb, line 29
def base
  String.try_convert(record.send(definition.origin)).to_s.parameterize separator: definition.separator
end
changed?() click to toggle source
# File lib/sluggable/rails/slug.rb, line 41
def changed?
  record.send "#{definition.origin}_changed?"
end
make() click to toggle source
# File lib/sluggable/rails/slug.rb, line 19
def make
  if makeable?
    @offset = 0
    generate until present? && unique?
    true
  else
    false
  end
end
makeable?() click to toggle source
# File lib/sluggable/rails/slug.rb, line 33
def makeable?
  definition.is_a?(Sluggable::Rails::Definition) && record.is_a?(ActiveRecord::Base)
end
needs_an_update?() click to toggle source
# File lib/sluggable/rails/slug.rb, line 49
def needs_an_update?
  undefined? || changed?
end
scope() click to toggle source
# File lib/sluggable/rails/slug.rb, line 53
def scope
  definition.scope.map{ |attribute| [attribute, record.send(attribute)] }.to_h
end
shifted?() click to toggle source
# File lib/sluggable/rails/slug.rb, line 37
def shifted?
  !offset.zero?
end
undefined?() click to toggle source
# File lib/sluggable/rails/slug.rb, line 45
def undefined?
  record.send(definition.attribute).blank?
end
update() click to toggle source
# File lib/sluggable/rails/slug.rb, line 10
def update
  if make
    record.send "#{definition.attribute}=", self.to_s
    true
  else
    false
  end
end

Protected Instance Methods

generate() click to toggle source
# File lib/sluggable/rails/slug.rb, line 59
def generate
  clear
  insert 0, base
  insert -1, (empty? ? '' : definition.separator) + offset.to_s if shifted?
  shift
end
shift() click to toggle source
# File lib/sluggable/rails/slug.rb, line 66
def shift
  @offset += 1
end
unique?() click to toggle source
# File lib/sluggable/rails/slug.rb, line 70
def unique?
  found = record.class.find_by({ definition.attribute => self.to_s }.merge(scope))
  !found || found.id == record.id
end