ruby on rails - others - Convertir la funda de camello para subrayar la maleta en rubí
coding standards camelcase (9)
¿Hay alguna función lista que convierta cadenas de caja de camello en una cadena separada de subrayado?
Quiero algo como esto:
"CamelCaseString".to_underscore
para devolver "camel_case_string".
...
Así es como lo hace Rails :
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
Echa un vistazo a snakecase de Ruby Facets
Los siguientes casos se manejan, como se ve a continuación:
"SnakeCase".snakecase #=> "snake_case"
"Snake-Case".snakecase #=> "snake_case"
"Snake Case".snakecase #=> "snake_case"
"Snake - Case".snakecase #=> "snake_case"
Desde: 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
Hay un método incorporado en Rails llamado ''guión bajo'' que puede usar para este propósito
"CamelCaseString".underscore #=> "camel_case_string"
El método de ''subrayado'' se puede considerar típicamente como inverso de ''camelize''
Implementación de Ruby de una sola línea:
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
Así que "SomeCamelCase".to_underscore # =>"some_camel_case"
Me gustaría esto:
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
Parche de mono de String
clase String
. Hay clases que comienzan con dos o más letras en mayúsculas.
Puedes usar
"CamelCasedName".tableize.singularize
O solo
"CamelCasedName".underscore
Ambas opciones opciones darán "camel_cased_name"
. Puedes ver más detalles here .
Receptor convertido a caso de serpiente: http://rubydoc.info/gems/extlib/0.9.15/String#snake_case-instance_method
Esta es la biblioteca de soporte para DataMapper y 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"
Short oneliner para CamelCases cuando tienes espacios también incluidos (no funciona correctamente si tienes una palabra intermedia con una letra inicial pequeña):
a = "Test String"
a.gsub('' '', '''').underscore
=> "test_string"
El ActiveSupport de Rails agrega un guión bajo a la Cadena usando lo siguiente:
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
Entonces puedes hacer cosas divertidas:
"CamelCase".underscore
=> "camel_case"