Method: ActiveSupport::Inflector#parameterize

Defined in:
lib/active_support/inflector/transliterate.rb

#parameterize(string, sep = :unused, separator: '-', preserve_case: false) ⇒ Object

Replaces special characters in a string so that it may be used as part of a ‘pretty’ URL.

parameterize("Donald E. Knuth") # => "donald-e-knuth"
parameterize("^trés|Jolie-- ")  # => "tres-jolie"

To use a custom separator, override the ‘separator` argument.

parameterize("Donald E. Knuth", separator: '_') # => "donald_e_knuth"
parameterize("^trés|Jolie-- ", separator: '_')  # => "tres_jolie"

To preserve the case of the characters in a string, use the ‘preserve_case` argument.

parameterize("Donald E. Knuth", preserve_case: true) # => "Donald-E-Knuth"
parameterize("^trés|Jolie-- ", preserve_case: true) # => "tres-Jolie"


82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/active_support/inflector/transliterate.rb', line 82

def parameterize(string, sep = :unused, separator: '-', preserve_case: false)
  unless sep == :unused
    ActiveSupport::Deprecation.warn("Passing the separator argument as a positional parameter is deprecated and will soon be removed. Use `separator: '#{sep}'` instead.")
    separator = sep
  end
  # Replace accented chars with their ASCII equivalents.
  parameterized_string = transliterate(string)

  # Turn unwanted chars into the separator.
  parameterized_string.gsub!(/[^a-z0-9\-_]+/i, separator)

  unless separator.nil? || separator.empty?
    if separator == "-".freeze
      re_duplicate_separator        = /-{2,}/
      re_leading_trailing_separator = /^-|-$/i
    else
      re_sep = Regexp.escape(separator)
      re_duplicate_separator        = /#{re_sep}{2,}/
      re_leading_trailing_separator = /^#{re_sep}|#{re_sep}$/i
    end
    # No more than one of the separator in a row.
    parameterized_string.gsub!(re_duplicate_separator, separator)
    # Remove leading/trailing separator.
    parameterized_string.gsub!(re_leading_trailing_separator, ''.freeze)
  end
  
  parameterized_string.downcase! unless preserve_case
  parameterized_string
end