module Sequel::Plugins::Slugging::InstanceMethods

Private Instance Methods

acceptable_slug?(slug) click to toggle source
# File lib/sequel/plugins/slugging.rb, line 118
def acceptable_slug?(slug)
  return false unless acceptable_string?(slug)
  reserved = Sequel::Plugins::Slugging.reserved_words
  return false if reserved && reserved.include?(slug)

  ds =
    if history_table = self.class.slugging_opts[:history]
      ds = db[history_table].where(slug: slug, sluggable_type: self.class.to_s)
      # If the record already exists, don't consider its own slug to be 'taken'.
      ds = ds.exclude(sluggable_id: pk) if pk
      ds
    else
      ds = self.class.dataset.where(slug: slug)
      # If the record already exists, don't consider its own slug to be 'taken'.
      ds = ds.exclude(self.class.primary_key => pk) if pk
      ds
    end

  ds.empty?
end
acceptable_string?(string) click to toggle source
# File lib/sequel/plugins/slugging.rb, line 139
def acceptable_string?(string)
  string && string != ''.freeze
end
before_create() click to toggle source
Calls superclass method
# File lib/sequel/plugins/slugging.rb, line 69
def before_create
  set_slug
  super
end
before_update() click to toggle source
Calls superclass method
# File lib/sequel/plugins/slugging.rb, line 74
def before_update
  if p = self.class.slugging_opts[:regenerate_slug]
    set_slug if instance_exec(&p)
  end

  super
end
find_available_slug() click to toggle source
# File lib/sequel/plugins/slugging.rb, line 92
def find_available_slug
  candidates = []

  Array(self.class.slugging_opts[:source]).each do |method_set|
    candidate = Array(method_set).map{|meth| get_slug_component(meth)}.join(' ')
    candidate = Sequel::Plugins::Slugging.slugifier.call(candidate)
    candidate = candidate.slice(0...Sequel::Plugins::Slugging.maximum_length)

    return candidate if acceptable_slug?(candidate)
    candidates << candidate
  end

  candidates.each do |candidate|
    return candidate << '-'.freeze << SecureRandom.uuid if acceptable_string?(candidate)
  end

  SecureRandom.uuid
end
get_slug_component(method) click to toggle source
# File lib/sequel/plugins/slugging.rb, line 111
def get_slug_component(method)
  case component = send(method)
  when NilClass, String then component
  else raise Error, "unexpected slug component: #{component.inspect}"
  end
end
set_slug() click to toggle source
# File lib/sequel/plugins/slugging.rb, line 82
def set_slug
  self.slug = find_available_slug

  if table = self.class.slugging_opts[:history]
    after_save_hook do
      db[table].insert(slug: slug, sluggable_id: pk, sluggable_type: self.class.to_s, created_at: Time.now)
    end
  end
end