module ActiveSupport::Inflector
def underscore(camel_cased_word)
+camelize+, though there are cases where that does not hold:
As a rule of thumb you can think of +underscore+ as the inverse of
'ActiveModel::Errors'.underscore # => "active_model/errors"
'ActiveModel'.underscore # => "active_model"
Changes '::' to '/' to convert namespaces to paths.
Makes an underscored, lowercase form from the expression in the string.
def underscore(camel_cased_word) word = camel_cased_word.to_s.dup word.gsub!('::', '/') word.gsub!(/(?:([A-Za-z\d])|^)(#{inflections.acronym_regex})(?=\b|[^a-z])/) { "#{$1}#{$1 && '_'}#{$2.downcase}" } word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2') word.gsub!(/([a-z\d])([A-Z])/,'\1_\2') word.tr!("-", "_") word.downcase! word end