Existe-t-il une fonction ready qui convertit les chaînes de l'affaire Camel en chaînes séparées par un soulignement?
Je veux quelque chose comme ça:
"CamelCaseString".to_underscore
pour retourner "camel_case_string".
...
ActiveSupport de Rails ajoute un trait de soulignement à la chaîne en utilisant les éléments suivants:
class String
def underscore
self.gsub(/::/, '/').
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
gsub(/([a-z\d])([A-Z])/,'\1_\2').
tr("-", "_").
downcase
end
end
Ensuite, vous pouvez faire des choses amusantes:
"CamelCase".underscore
=> "camel_case"
Vous pouvez utiliser
"CamelCasedName".tableize.singularize
Ou juste
"CamelCasedName".underscore
Les deux options donnent "camel_cased_name"
. Vous pouvez vérifier plus de détails le ici .
One-Liner Ruby implémentation:
class String
# Ruby mutation methods have the expectation to return self if a mutation occurred, nil otherwise. (see http://www.Ruby-doc.org/core-1.9.3/String.html#method-i-gsub-21)
def to_underscore!
gsub!(/(.)([A-Z])/,'\1_\2')
downcase!
end
def to_underscore
dup.tap { |s| s.to_underscore! }
end
end
Alors "SomeCamelCase".to_underscore # =>"some_camel_case"
Il existe une méthode intégrée Rails appelée "caractère de soulignement" que vous pouvez utiliser à cette fin.
"CamelCaseString".underscore #=> "camel_case_string"
La méthode 'underscore' peut généralement être considérée comme l'inverse de 'camelize'
Voici comment Rails le fait :
def underscore(camel_cased_Word)
camel_cased_Word.to_s.gsub(/::/, '/').
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
gsub(/([a-z\d])([A-Z])/,'\1_\2').
tr("-", "_").
downcase
end
Récepteur converti en snake case: http://rubydoc.info/gems/extlib/0.9.15/String#snake_case-instance_method
C'est la bibliothèque de support pour DataMapper et Merb. ( http://rubygems.org/gems/extlib )
def snake_case
return downcase if match(/\A[A-Z]+\z/)
gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
gsub(/([a-z])([A-Z])/, '\1_\2').
downcase
end
"FooBar".snake_case #=> "foo_bar"
"HeadlineCNNNews".snake_case #=> "headline_cnn_news"
"CNN".snake_case #=> "cnn"
Découvrez snakecase de Ruby Facets
Les cas suivants sont traités, comme indiqué ci-dessous:
"SnakeCase".snakecase #=> "snake_case"
"Snake-Case".snakecase #=> "snake_case"
"Snake Case".snakecase #=> "snake_case"
"Snake - Case".snakecase #=> "snake_case"
De: https://github.com/rubyworks/facets/blob/master/lib/core/facets/string/snakecase.rb
class String
# Underscore a string such that camelcase, dashes and spaces are
# replaced by underscores. This is the reverse of {#camelcase},
# albeit not an exact inverse.
#
# "SnakeCase".snakecase #=> "snake_case"
# "Snake-Case".snakecase #=> "snake_case"
# "Snake Case".snakecase #=> "snake_case"
# "Snake - Case".snakecase #=> "snake_case"
#
# Note, this method no longer converts `::` to `/`, in that case
# use the {#pathize} method instead.
def snakecase
#gsub(/::/, '/').
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
gsub(/([a-z\d])([A-Z])/,'\1_\2').
tr('-', '_').
gsub(/\s/, '_').
gsub(/__+/, '_').
downcase
end
#
alias_method :underscore, :snakecase
# TODO: Add *separators to #snakecase, like camelcase.
end
Une ligne courte pour les valises Camel lorsque vous avez également des espaces (ne fonctionne pas correctement si vous avez un mot intermédiaire avec une petite lettre de départ):
a = "Test String"
a.gsub(' ', '').underscore
=> "test_string"
Je voudrais ceci:
class String
# \n returns the capture group of "n" index
def snikize
self.gsub(/::/, '/')
.gsub(/([a-z\d])([A-Z])/, "\1_\2")
.downcase
end
# or
def snikize
self.gsub(/::/, '/')
.gsub(/([a-z\d])([A-Z])/) do
"#{$1}_#{$2}"
end
.downcase
end
end
Patch de singe de la classe String
. Il y a des classes qui commencent par deux lettres ou plus en majuscule.