module Decidim::Nicknamizable

This concern contains the logic related to nicknames.

Public Instance Methods

disambiguate(name, scope) click to toggle source
# File lib/decidim/nicknamizable.rb, line 51
def disambiguate(name, scope)
  candidate = name

  2.step do |n|
    return candidate unless exists?(scope.merge(nickname: candidate))

    candidate = numbered_variation_of(name, n)
  end
end
nickname_length_range() click to toggle source
# File lib/decidim/nicknamizable.rb, line 47
def nickname_length_range
  (0...nickname_max_length)
end
nickname_max_length() click to toggle source

Maximum allowed nickname length

# File lib/decidim/nicknamizable.rb, line 18
def nickname_max_length
  20
end
nicknamize(name, scope = {}) click to toggle source

Converts any string into a valid nickname

  • Parameterizes it so it's valid as a URL.

  • Trims length so it fits validation constraints.

  • Disambiguates it so it's unique.

name - the String to nicknamize scope - a Hash with extra values to scope the nickname to

Example to nicknamize a user name, scoped to the organization:

nicknamize(user_name, organization: current_organization)
# File lib/decidim/nicknamizable.rb, line 36
def nicknamize(name, scope = {})
  return unless name

  disambiguate(
    name.parameterize(separator: "_")[nickname_length_range],
    scope
  )
end
numbered_variation_of(name, number) click to toggle source
# File lib/decidim/nicknamizable.rb, line 61
def numbered_variation_of(name, number)
  appendix = "_#{number}"

  "#{name[0...(nickname_max_length - appendix.length)]}#{appendix}"
end