Sha256: 909173226444ba7943686dcf46a2d5277ec285b47e842aa22e2463c4aa71bd05
Contents?: true
Size: 1.64 KB
Versions: 13
Compression:
Stored size: 1.64 KB
Contents
# frozen_string_literal: true require "active_support/concern" module Decidim # This concern contains the logic related to nicknames. module Nicknamizable extend ActiveSupport::Concern included do validates :nickname, length: { maximum: nickname_max_length }, allow_blank: true end class_methods do # # Maximum allowed nickname length # def nickname_max_length 20 end # # Converts any string into a valid nickname # # * Parameterizes it so it is valid as a URL. # * Trims length so it fits validation constraints. # * Disambiguates it so it is 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) # def nicknamize(name, scope = {}) return unless name disambiguate( name.parameterize(separator: "_")[nickname_length_range], scope ) end private def nickname_length_range (0...nickname_max_length) end def disambiguate(name, scope) candidate = name 2.step do |n| return candidate if Decidim::UserBaseEntity.where("nickname ILIKE ?", candidate.downcase).where(scope).empty? candidate = numbered_variation_of(name, n) end end def numbered_variation_of(name, number) appendix = "_#{number}" "#{name[0...(nickname_max_length - appendix.length)]}#{appendix}" end end end end
Version data entries
13 entries across 13 versions & 1 rubygems