Estoy tratando de que Rails ponga en mayúscula el primer carácter de una cadena y deje todos los demás 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 carácter?
Gracias
EDITAR: Traté de implementar lo que sugirió macek, pero obtengo un error de "método indefinido 'capitalizar'" . El código funciona bien sin la línea en mayúscula. ¡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
EDITAR 2: Lo tengo funcionando. ¡Gracias por la ayuda!
EDITAR 3: Espera, no, no lo hice ... 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
EDITAR 4: Probé la edición de macek, y aún obtengo un error de método indefinido "capitalizar" . ¿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
EDITAR 5: Esto es extraño. Puedo deshacerme del error del método indefinido usando la línea a continuación. El problema es que parece reemplazar la primera letra con un número. Por ejemplo, en lugar de poner en mayúscula la y en usted , convierte la y en un 121
self.title[0] = title[0].to_s.capitalize
fuente
EDIT 3
, debe comenzar la línea 2 conself.title =
. Además, en las 3 líneas, solo necesitaself.title
a la izquierda de un=
(signo igual). En otros lugares puedes usartitle
. Vea la edición de mi respuesta para ver un ejemplo.Respuestas:
Titleize pondrá en mayúscula cada palabra. Esta línea se siente pesada, pero garantizará que la única letra cambiada sea la primera.
Actualizar:
fuente
s[0].capitalize + s[1..-1] if s.present?
Esto debería hacerlo:
fuente
title[0] = title[0].capitalize
title.first.capitalize!
capitalize
convierte todas las letras después de la primera letra a minúsculas, por lo que no funciona para la cadena presentada en la pregunta ("soy de Nueva York").Puedes usar humanizar. Si no necesita guiones bajos u otras mayúsculas en sus líneas de texto.
Entrada:
Salida:
fuente
humanize
cuidado , es el método Rails, exactamente ActiveSupport. El rubí simple no puede hacer eso.fuente
^
significa principio de línea, se"\nfoo"
convierte en"\nFoo"
. Probablemente eso esté bien para la mayoría de los casos de uso. Dado que es asub
y no agsub
, solo subirá una letra, incluso con cadenas de varias líneas.str.sub(/\S/, &:upcase)
, que buscará el primer carácter que no sea un espacio en blanco y lo reemplazará.A partir de Rails 5.0.0.beta4 puedes usar el nuevo
String#upcase_first
método oActiveSupport::Inflector#upcase_first
hacerlo. Consulte esta publicación de blog para obtener más información.fuente
Una solución orientada a objetos:
Entonces puedes hacer esto:
fuente
String
clase.fuente
Editar 2
Parece que no puedo replicar tu problema. Continúe y ejecute este script nativo de Ruby. Genera la salida exacta que estás buscando y Rails admite todos estos métodos. ¿Con qué tipo de entradas tiene problemas?
salida
Editar
Según tu edición, puedes probar algo como esto.
Original
Esto hará el truco
Al intentar usar
String#capitalize
en toda la cadena, estaba viendoI'm from new york
porque el método:fuente
fuente
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
tap
después dedup
para obtener una copia editadafuente
Si y solo si OP quisiera hacer un parche de mono en el objeto String, entonces esto se puede usar
Ahora úsalo:
fuente
Una versión aún más corta podría ser:
fuente
Nadie ha mencionado gsub, lo que le permite hacer esto de forma concisa.
Ejemplo:
fuente
Quizás la forma más sencilla.
fuente
Tenga en cuenta que si necesita tratar con caracteres de varios bytes, es decir, si tiene que internacionalizar su sitio, la
s[0] = ...
solución no será adecuada. Esta pregunta de Stack Overflow sugiere usar la gema unicode-utilRuby 1.9: ¿como puedo subir y bajar correctamente cadenas multibyte?
EDITAR
En realidad, una forma más fácil de evitar al menos codificaciones de cadenas extrañas es simplemente usar String # mb_chars :
fuente
¿Qué pasa con el método de clasificación en cadena?
salida:
fuente
"hello worlds".classify # => "Hello world"
fuente
string[i]
no funciona en otros idiomas. Por favor, ayude a mantener StackOverflow libre de este tipo de respuestas pirateadas. No podemos decir RTFM, pero incluso un vistazo rápido a losString
documentos habría ayudado a evitar una respuesta como esta ...