ruby-on-rails string capitalization

ruby on rails - ¿Capitalizar solo el primer carácter de la cadena y dejar a los demás en paz?(Rieles)



ruby uppercase (17)

Editar 2

Parece que no puedo replicar tu problema. Adelante, ejecuta este script nativo de Ruby. Genera el resultado exacto que buscas y Rails admite todos estos métodos. ¿Con qué tipo de entradas estás teniendo problemas?

#!/usr/bin/ruby def fixlistname(title) title = title.lstrip title += ''...'' unless title =~ //.{3}$/ title[0] = title[0].capitalize raise ''Title must start with "You know you..."'' unless title =~ /^You know you/ title end DATA.each do |title| puts fixlistname(title) end __END__ you know you something WITH dots ... you know you something WITHOUT the dots you know you something with LEADING whitespace... you know you something with whitespace BUT NO DOTS this generates error because it doesn''t start with you know you

salida

You know you something WITH dots ... You know you something WITHOUT the dots... You know you something with LEADING whitespace... You know you something with whitespace BUT NO DOTS... RuntimeError: Title must start with "You know you..."

Editar

En función de su edición, puede intentar algo como esto.

def fixlistname! self.title = title.lstrip self.title += ''...'' unless title.ends_with?(''...'') self.title[0] = title[0].capitalize errors.add_to_base(''Title must start with "You know you..."'') unless title.starts_with?("You know you") end

Original

Esto hará el truco

s = "i''m from New York" s[0] = s[0].capitalize #=> I''m from New York

Al tratar de usar String#capitalize en toda la cadena, estabas viendo I''m from new york porque el método:

Devuelve una copia de str con el primer carácter convertido a mayúscula y el resto a minúscula.

"hello".capitalize #=> "Hello" "HELLO".capitalize #=> "Hello" "123ABC".capitalize #=> "123abc"

Intento que Rails capitalice el primer carácter de una cuerda y deje todos los demás tal como están. Me encuentro con un problema en el que "soy de Nueva York" se convierte en "soy de Nueva York".

¿Qué método usaría para seleccionar el primer personaje?

Gracias

EDITAR: Intenté implementar lo que macek sugirió, pero aparece el error "método no definido` capitalizar '''' . El código funciona bien sin la línea capitalizar. ¡Gracias por la ayuda!

def fixlistname! self.title = self.title.lstrip + (title.ends_with?("...") ? "" : "...") self.title[0] = self.title[0].capitalize errors.add_to_base("Title must start with /"You know you.../"") unless self.title.starts_with? ''You know you'' end

EDIT 2: Lo tengo funcionando. ¡Gracias por la ayuda!

EDIT 3: Espera, no, yo no ... Esto es lo que tengo en mi modelo de lista.

def fixlistname! self.title = self.title.lstrip + (title.ends_with?("...") ? "" : "...") self.title.slice(0,1).capitalize + self.title.slice(1..-1) errors.add_to_base("Title must start with /"You know you.../"") unless self.title.starts_with? ''You know you'' end

EDIT 4: Intenté la edición de Macek, y todavía obtengo un error de ''capitalizar'' el método indefinido . ¿Qué podría estar haciendo mal?

def fixlistname! self.title = title.lstrip self.title += ''...'' unless title.ends_with?(''...'') self.title[0] = title[0].capitalize errors.add_to_base(''Title must start with "You know you..."'') unless title.starts_with?("You know you") end

EDIT 5: Esto es extraño. Puedo eliminar el error de método indefinido utilizando la línea siguiente. El problema es que parece reemplazar la primera letra con un número. Por ejemplo, en lugar de capitalizar el y en You , convierte el y en un 121

self.title[0] = title[0].to_s.capitalize


¿Qué pasa con el método de clasificación en la cadena?

''somESTRIng''.classify

salida:

#rails => ''SomESTRIng''


A partir de Rails 5.0.0.beta4 , puede usar el nuevo método String#upcase_first o ActiveSupport::Inflector#upcase_first para hacerlo. Consulte esta publicación en el blog para obtener más información.


Esto debería hacerlo:

title = "test test" title[0] = title[0].capitalize puts title # "Test test"


La mayoría de estas respuestas editan la cadena en su lugar, cuando solo está formateando para la salida de la vista, es posible que no desee cambiar la cadena subyacente para que pueda usar la función tap después de un dup para obtener una copia editada.

''test''.dup.tap { |string| string[0] = string[0].upcase }


Nadie mencionó gsub, lo que te permite hacer esto de manera concisa.

string.gsub(/^([a-z])/) { $1.capitalize }

Ejemplo:

> ''caps lock must go''.gsub(/^(.)/) { $1.capitalize } => "Caps lock must go"


Puedes usar humanize. Si no necesita guiones bajos u otras mayúsculas en sus líneas de texto.

Entrada:

"i''m from New_York...".humanize

Salida:

"I''m from new york..."


Quizás la forma más fácil.

s = "test string" s[0] = s[0].upcase # => "Test string"


Si, y solo si, OP quisiera aplicar el parche mono en el objeto String, entonces esto se puede usar

class String # Only capitalize first letter of a string def capitalize_first self.sub(//S/, &:upcase) end end

Ahora úsalo:

"i live in New York".capitalize_first #=> I live in New York



Titleize capitalizará cada palabra. Esta línea se siente fuerte, pero garantizará que la única letra cambiada es la primera.

new_string = string.slice(0,1).capitalize + string.slice(1..-1)

Actualizar:

irb(main):001:0> string = "i''m from New York..." => "i''m from New York..." irb(main):002:0> new_string = string.slice(0,1).capitalize + string.slice(1..-1) => "I''m from New York..."


Una solución orientada a objetos:

class String def capitalize_first_char self.sub(/^(.)/) { $1.capitalize } end end

Entonces puedes hacer esto:

"i''m from New York".capitalize_first_char


Una versión aún más corta podría ser:

s = "i''m from New York..." s[0] = s.capitalize[0]


my_string = "hello, World" my_string.sub(//S/, &:upcase) # => "Hello, World"


str = "this is a Test" str.sub(/^./, &:upcase) # => "This is a Test"


str.sub(/./, &:capitalize)


string = "i''m from New York" string.split(//s+/).each{ |word,i| word.capitalize! unless i > 0 }.join('' '') # => I''m from New York