module Slugable::ActsAsSlugable::LocalInstanceMethods

Private Instance Methods

create_slug() click to toggle source
# File lib/acts_as_slugable/acts_as_slugable_4.rb, line 57
def create_slug
  return if self.errors.count > 0

  if self[slug_column].to_s.empty?
    test_string = self[source_column]

    proposed_slug = test_string.strip.downcase.gsub(/['"#\$,.!?%@()]+/, '')
    proposed_slug = proposed_slug.gsub(/&/, 'and')
    proposed_slug = proposed_slug.gsub(/[\W]+/, '-')
    proposed_slug = proposed_slug.gsub(/-{2}/, '-')

    suffix = ''
    existing = true

    acts_as_slugable_class.transaction do
      while existing != nil
        existing = acts_as_slugable_class.where(["#{slug_column} = ? and #{slug_scope_condition}", proposed_slug + suffix]).first
        if existing
          if suffix.empty?
            suffix = "-0"
          else
            suffix.succ!
          end
        end
      end
    end

    self[slug_column] = proposed_slug + suffix
  end
end