Estou tentando fazer com que o Rails coloque em maiúscula o primeiro caractere de uma string e deixe todos os outros do jeito que estão. Estou tendo um problema em que "sou de Nova York" se transforma em "Sou de Nova York".
Que método devo usar para selecionar o primeiro personagem?
obrigado
EDIT: Eu tentei implementar o que o macek sugeriu, mas estou recebendo um erro "método indefinido` capitalize '" . O código funciona bem sem a linha maiúscula. Obrigado pela ajuda!
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: está funcionando. Obrigado pela ajuda!
EDIT 3: Espere, não, eu não ... Aqui está o que tenho no meu 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: Tentei editar o macek e ainda estou obtendo um erro de método indefinido `capitalize '" . O que posso estar fazendo de errado?
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: Isso é estranho. Consigo me livrar do erro do método indefinido usando a linha abaixo. O problema é que parece substituir a primeira letra por um número. Por exemplo, em vez de colocar y em maiúscula em Você , ele transforma y em 121
self.title[0] = title[0].to_s.capitalize
fonte
EDIT 3
, você precisa iniciar a linha 2 comself.title =
. Além disso, em todas as 3 linhas, você só precisaself.title
à esquerda de um=
(sinal de igual). Em outros lugares você pode apenas usartitle
. Veja a edição em minha resposta para um exemplo.Respostas:
Titleize irá capitalizar cada palavra. Esta linha parece pesada, mas garantirá que a única letra alterada seja a primeira.
Atualizar:
fonte
s[0].capitalize + s[1..-1] if s.present?
Isso deve servir:
fonte
title[0] = title[0].capitalize
title.first.capitalize!
capitalize
converte todas as letras após a primeira letra em minúsculas, então não funciona para a string apresentada na pergunta ("eu sou de Nova York").Você pode usar humanizar. Se você não precisa de sublinhados ou outras letras maiúsculas em suas linhas de texto.
Entrada:
Resultado:
fonte
humanize
é o Rails, exatamente o método ActiveSupport. Rubi puro não pode fazer isso.fonte
^
significa início de linha,"\nfoo"
torna-se"\nFoo"
. Isso provavelmente é adequado para a maioria dos casos de uso. Uma vez que é umsub
e não umgsub
, ainda será maiúscula apenas uma letra, mesmo com strings de várias linhas.str.sub(/\S/, &:upcase)
, que localizará o primeiro caractere diferente de espaço em branco e o colocará em letras maiúsculas.A partir do Rails 5.0.0.beta4 você pode usar o novo
String#upcase_first
método ouActiveSupport::Inflector#upcase_first
fazê-lo. Verifique esta postagem do blog para mais informações.fonte
Uma solução orientada a objetos:
Então você pode apenas fazer isso:
fonte
String
classe.fonte
Editar 2
Não consigo reproduzir o seu problema. Vá em frente e execute este script Ruby nativo. Ele gera a saída exata que você está procurando, e Rails suporta todos esses métodos. Com que tipo de entrada você está tendo problemas?
resultado
Editar
Com base na sua edição, você pode tentar algo assim.
Original
Isto irá fazer o truque
Ao tentar usar
String#capitalize
em toda a string, você percebeuI'm from new york
porque o método:fonte
fonte
A maioria dessas respostas edita a string no local; quando você está apenas formatando para a saída de visualização, você pode não querer mudar a string subjacente para que possa usar
tap
depois dedup
para obter uma cópia editadafonte
Se e somente se OP quiser fazer monkey patching no objeto String, então isso pode ser usado
Agora use:
fonte
Uma versão ainda mais curta poderia ser:
fonte
Ninguém mencionou o gsub, o que permite que você faça isso de forma concisa.
Exemplo:
fonte
Talvez a maneira mais fácil.
fonte
Observe que se você precisar lidar com caracteres multibyte, ou seja, se tiver que internacionalizar seu site, a
s[0] = ...
solução não será adequada. Esta questão do Stack Overflow sugere o uso da gem unicode-utilRuby 1.9: como posso fazer o upcase e o downcase de strings multibyte?
EDITAR
Na verdade, uma maneira mais fácil de pelo menos evitar codificações estranhas de string é apenas usar String # mb_chars :
fonte
E quanto ao método de classificação em string?
resultado:
fonte
"hello worlds".classify # => "Hello world"
fonte
string[i]
não funciona em outros idiomas. Ajude a manter o StackOverflow livre desse tipo de resposta hackeada. Não podemos dizer RTFM, mas mesmo uma rápida olhada nosString
documentos teria ajudado a evitar uma resposta como esta ...