J'essaie de faire en sorte que Rails capitalise le premier caractère d'une chaîne et laisse tous les autres tels quels. Je rencontre un problème où «je suis de New York» se transforme en «je viens de New York».
Quelle méthode utiliserais-je pour sélectionner le premier caractère?
Merci
EDIT: J'ai essayé d'implémenter ce que macek a suggéré, mais j'obtiens une erreur "méthode non définie` capitalize '" . Le code fonctionne bien sans la ligne de capitalisation. Merci pour l'aide!
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: ça marche. Merci pour l'aide!
EDIT 3: Attendez, non je n'ai pas ... Voici ce que j'ai dans mon modèle de liste.
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: J'ai essayé l'édition de macek, et j'ai toujours une erreur de méthode non définie "capitalize" " . Qu'est-ce que je pourrais faire de 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: C'est bizarre. Je suis en mesure de me débarrasser de l'erreur de méthode non définie en utilisant la ligne ci-dessous. Le problème est qu'il semble remplacer la première lettre par un chiffre. Par exemple, au lieu de mettre en majuscule le y dans You , il transforme le y en un 121
self.title[0] = title[0].to_s.capitalize
la source
EDIT 3
, vous devez commencer la ligne 2 avecself.title =
. De plus, sur les 3 lignes, vous n'avez besoin queself.title
de la gauche d'un=
(signe égal). Dans d'autres endroits, vous pouvez simplement utilisertitle
. Voir la modification sur ma réponse pour un exemple.Réponses:
Titleize mettra en majuscule chaque mot. Cette ligne semble lourde, mais garantira que la seule lettre modifiée est la première.
Mettre à jour:
la source
s[0].capitalize + s[1..-1] if s.present?
Cela devrait le faire:
la source
title[0] = title[0].capitalize
title.first.capitalize!
capitalize
convertit toutes les lettres après la première lettre en minuscules, donc cela ne fonctionne pas pour la chaîne présentée dans la question ("je viens de New York").Vous pouvez utiliser humaniser. Si vous n'avez pas besoin de traits de soulignement ou d'autres majuscules dans vos lignes de texte.
Contribution:
Production:
la source
humanize
c'est la méthode Rails, exactement ActiveSupport. Le rubis uni ne peut pas faire cela.la source
^
signifie début de ligne,"\nfoo"
devient"\nFoo"
. C'est probablement bien pour la plupart des cas d'utilisation. Puisqu'il s'agit d'unsub
et non d'ungsub
, il ne mettra toujours qu'une seule lettre, même avec des chaînes multilignes.str.sub(/\S/, &:upcase)
, qui trouvera le premier caractère non blanc et le valorisera.Depuis Rails 5.0.0.beta4, vous pouvez utiliser la nouvelle
String#upcase_first
méthode ouActiveSupport::Inflector#upcase_first
pour le faire. Consultez cet article de blog pour plus d'informations.la source
Une solution orientée objet:
Ensuite, vous pouvez simplement faire ceci:
la source
String
classe.la source
Modifier 2
Je n'arrive pas à reproduire votre problème. Allez-y et exécutez ce script Ruby natif. Il génère la sortie exacte que vous recherchez et Rails prend en charge toutes ces méthodes. Avec quel type d'entrées rencontrez-vous des problèmes?
production
Éditer
En fonction de votre modification, vous pouvez essayer quelque chose comme ça.
Original
Ça fera l'affaire
En essayant d'utiliser
String#capitalize
sur toute la chaîne, vous voyiezI'm from new york
parce que la méthode:la source
la source
La plupart de ces réponses modifient la chaîne en place, lorsque vous formatez simplement pour la sortie de la vue, vous ne voudrez peut-être pas changer la chaîne sous-jacente afin que vous puissiez utiliser
tap
après adup
pour obtenir une copie modifiéela source
Si et seulement si OP souhaite effectuer un patching de singe sur un objet String, cela peut être utilisé
Maintenant, utilisez-le:
la source
Une version encore plus courte pourrait être:
la source
Personne n'a mentionné gsub, ce qui vous permet de le faire de manière concise.
Exemple:
la source
Peut-être le moyen le plus simple.
la source
Notez que si vous avez besoin de traiter des caractères multi-octets, c'est à dire si vous devez internationaliser votre site, la
s[0] = ...
solution ne sera pas adéquate. Cette question de débordement de pile suggère d'utiliser la gemme unicode-utilRuby 1.9: Comment puis-je correctement upcase & downcase multibyte strings?
ÉDITER
En fait, un moyen plus simple d'éviter au moins les encodages de chaînes étranges est d'utiliser simplement String # mb_chars :
la source
Qu'en est-il de la méthode de classification sur chaîne?
production:
la source
"hello worlds".classify # => "Hello world"
la source
string[i]
cela ne fonctionne pas dans d'autres langues. S'il vous plaît, aidez à garder StackOverflow sans encombrement de ce genre de réponses piratées. Nous ne pouvons pas dire RTFM, mais même un rapide coup d'œil à laString
documentation aurait aidé à éviter une réponse comme celle-ci ...