Conversione di custodia di cammello per sottolineare il caso in ruby

Esiste una funzione pronta che converta le stringhe del caso cammello in una stringa separata da underscore?

Voglio qualcosa del genere:

"CamelCaseString".to_underscore 

per restituire “camel_case_string”.

    ActiveSupport di Rails aggiunge il carattere di sottolineatura alla stringa utilizzando quanto segue:

     class String def underscore self.gsub(/::/, '/'). gsub(/([AZ]+)([AZ][az])/,'\1_\2'). gsub(/([az\d])([AZ])/,'\1_\2'). tr("-", "_"). downcase end end 

    Quindi puoi fare cose divertenti:

     "CamelCase".underscore => "camel_case" 

    Puoi usare

     "CamelCasedName".tableize.singularize 

    O semplicemente

     "CamelCasedName".underscore 

    Entrambe le opzioni daranno "camel_cased_name" . Puoi controllare più dettagli qui .

    Implementazione Ruby one-liner:

     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!(/(.)([AZ])/,'\1_\2') downcase! end def to_underscore dup.tap { |s| s.to_underscore! } end end 

    Quindi "SomeCamelCase".to_underscore # =>"some_camel_case"

    C’è un metodo integrato di Rails chiamato ‘underscore’ che puoi usare per questo scopo

     "CamelCaseString".underscore #=> "camel_case_string" 

    Il metodo ‘underscore’ può essere considerato come inverso di ‘camelize’

    Ecco come lo fa Rails :

      def underscore(camel_cased_word) camel_cased_word.to_s.gsub(/::/, '/'). gsub(/([AZ]+)([AZ][az])/,'\1_\2'). gsub(/([az\d])([AZ])/,'\1_\2'). tr("-", "_"). downcase end 

    Ricevitore convertito in caso di serpente: http://rubydoc.info/gems/extlib/0.9.15/String#snake_case-instance_method

    Questa è la libreria di supporto per DataMapper e Merb. ( http://rubygems.org/gems/extlib )

     def snake_case return downcase if match(/\A[AZ]+\z/) gsub(/([AZ]+)([AZ][az])/, '\1_\2'). gsub(/([az])([AZ])/, '\1_\2'). downcase end "FooBar".snake_case #=> "foo_bar" "HeadlineCNNNews".snake_case #=> "headline_cnn_news" "CNN".snake_case #=> "cnn" 

    Scopri snakecase da Ruby Facets

    I seguenti casi sono gestiti, come mostrato di seguito:

     "SnakeCase".snakecase #=> "snake_case" "Snake-Case".snakecase #=> "snake_case" "Snake Case".snakecase #=> "snake_case" "Snake - Case".snakecase #=> "snake_case" 

    Da: 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(/([AZ]+)([AZ][az])/,'\1_\2'). gsub(/([az\d])([AZ])/,'\1_\2'). tr('-', '_'). gsub(/\s/, '_'). gsub(/__+/, '_'). downcase end # alias_method :underscore, :snakecase # TODO: Add *separators to #snakecase, like camelcase. end 

    Short oneliner per CamelCases quando hai anche spazi inclusi (non funziona correttamente se hai una parola in mezzo con una piccola lettera iniziale):

     a = "Test String" a.gsub(' ', '').underscore => "test_string" 

    Mi piacerebbe questo:

     class String # \n returns the capture group of "n" index def snikize self.gsub(/::/, '/') .gsub(/([az\d])([AZ])/, "\1_\2") .downcase end # or def snikize self.gsub(/::/, '/') .gsub(/([az\d])([AZ])/) do "#{$1}_#{$2}" end .downcase end end 

    Scimmia patch di class String . Esistono classi che iniziano con due o più lettere in maiuscolo.