ruby-on-rails - Convertir la funda de camello para subrayar la maleta en rubí





formatting camelcasing underscores (9)


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"

¿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".

...




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"




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"






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'




Puedes usar

"CamelCasedName".tableize.singularize

O solo

"CamelCasedName".underscore

Ambas opciones opciones darán "camel_cased_name" . Puedes ver más detalles here .




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



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



Usa classify Maneja bien las cajas de borde.

"app_user".classify # => AppUser
"user_links".classify   # => UserLink

Nota:

Esta respuesta es específica a la descripción dada en la pregunta (no es específica del título de la pregunta). Si uno trata de convertir una cuerda en camel-case, debería usar la respuesta de Sergio . El interlocutor declara que quiere convertir app_user en AppUser (no App_user ), de ahí esta respuesta.





ruby-on-rails ruby formatting camelcasing underscores