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
Tenga en cuenta que si necesita tratar con caracteres de varios bytes, es decir, si debe internacionalizar su sitio, la solución s[0] = ...
no será adecuada. Esta pregunta SO sugiere usar la gema Unicode-util
Ruby 1.9: ¿cómo puedo usar cadenas de multibyte en mayúsculas y minúsculas?
EDITAR
En realidad, una forma más sencilla de evitar al menos extrañas codificaciones de cadena es simplemente usar String#mb_chars :
s = s.mb_chars
s[0] = s.first.upcase
s.to_s
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