Próbuję zmusić Railsy do zapisania wielkimi literami pierwszego znaku ciągu i pozostawienia wszystkich innych takimi, jakie są. Mam problem, w wyniku którego „Jestem z Nowego Jorku” zamienia się w „Jestem z Nowego Jorku”.
Jakiej metody użyłbym, aby wybrać pierwszy znak?
Dzięki
EDYCJA: Próbowałem zaimplementować to, co zasugerował macek, ale otrzymuję błąd „niezdefiniowana metoda„ używać wielkich liter ” . Kod działa dobrze bez wiersza z wielką literą. Dzięki za pomoc!
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
EDYCJA 2: Działa. Dzięki za pomoc!
EDYCJA 3: Czekaj, nie, nie ... Oto, co mam w moim modelu listy.
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
EDYCJA 4: Wypróbowałem edycję macek, ale nadal otrzymuję błąd „ wielkiej ” metody w niezdefiniowanej metodzie . Co mogę zrobić źle?
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
EDYCJA 5: To dziwne. Jestem w stanie pozbyć się niezdefiniowanego błędu metody, korzystając z poniższej linii. Problem w tym, że zdaje się zastępować pierwszą literę liczbą. Na przykład, zamiast pisać wielką literę y w tobie , zamienia y w 121
self.title[0] = title[0].to_s.capitalize
źródło
EDIT 3
, musisz zacząć linię 2 odself.title =
. Ponadto we wszystkich 3 liniach wystarczyself.title
po lewej stronie=
(znak równości). W innych miejscach możesz po prostu użyćtitle
. Zobacz przykład w mojej odpowiedzi.Odpowiedzi:
W Titleize każde słowo będzie wielką literą. Ta linia wydaje się mocna, ale gwarantuje, że jedyna zmieniona litera jest pierwszą.
Aktualizacja:
źródło
s[0].capitalize + s[1..-1] if s.present?
To powinno wystarczyć:
źródło
title[0] = title[0].capitalize
title.first.capitalize!
capitalize
konwertuje wszystkie litery po pierwszej literze na małe, więc nie działa dla ciągu przedstawionego w pytaniu („Jestem z Nowego Jorku”).Możesz użyć humanizacji. Jeśli nie potrzebujesz podkreśleń ani innych wielkich liter w liniach tekstu.
Wejście:
Wynik:
źródło
humanize
jest Rails, dokładnie metoda ActiveSupport. Zwykły rubin nie może tego zrobić.źródło
^
oznacza początek linii,"\nfoo"
staje się"\nFoo"
. To prawdopodobnie w porządku w większości przypadków użycia. Ponieważ jest tosub
a nie agsub
, to nadal będzie tylko jedna litera, nawet w przypadku ciągów wielowierszowych.str.sub(/\S/, &:upcase)
, używając polecenia , które znajdzie pierwszy znak niebędący białą spacją i zapisze go w górę.Od wersji Rails 5.0.0.beta4 możesz użyć nowej
String#upcase_first
metody lubActiveSupport::Inflector#upcase_first
to zrobić. Więcej informacji znajdziesz w tym poście na blogu .źródło
Rozwiązanie zorientowane obiektowo:
Następnie możesz po prostu zrobić to:
źródło
String
klasy.źródło
Edytuj 2
Nie mogę powtórzyć twojego kłopotu. Śmiało i uruchom ten natywny skrypt Ruby. Generuje dokładnie takie wyjście, jakiego szukasz, a Railsy obsługują wszystkie te metody. Z jakim rodzajem danych wejściowych masz problem?
wynik
Edytować
W oparciu o swoją zmianę możesz spróbować czegoś takiego.
Oryginalny
To wystarczy
Podczas próby użycia
String#capitalize
na całym ciągu, zobaczyłeś,I'm from new york
ponieważ metoda:źródło
źródło
Większość z tych odpowiedzi edytuje ciąg w miejscu, kiedy tylko formatujesz dane wyjściowe, możesz nie chcieć zmieniać podstawowego ciągu, więc możesz użyć
tap
po a,dup
aby uzyskać edytowaną kopięźródło
Jeśli i tylko wtedy, gdy OP chciałby wykonać małpią poprawkę na obiekcie String, można tego użyć
Teraz użyj:
źródło
Jeszcze krótsza wersja mogłaby wyglądać następująco:
źródło
Nikt nie wspomniał o gsub, co pozwala to zrobić zwięźle.
Przykład:
źródło
Być może najłatwiejszy sposób.
źródło
Pamiętaj, że jeśli musisz radzić sobie ze znakami wielobajtowymi, tj. Jeśli musisz umiędzynarodowić swoją witrynę,
s[0] = ...
rozwiązanie nie będzie odpowiednie. To pytanie dotyczące przepełnienia stosu sugeruje użycie klejnotu unicode-utilRuby 1.9: w jaki sposób mogę odpowiednio zmienić wielkość i małe litery na łańcuchy wielobajtowe?
EDYTOWAĆ
Właściwie łatwiejszym sposobem przynajmniej uniknięcia dziwnego kodowania ciągów jest po prostu użycie String # mb_chars :
źródło
A co z klasyfikacją metody na łańcuchu?
wynik:
źródło
"hello worlds".classify # => "Hello world"
źródło
string[i]
nie działa w innych językach. Pomóż zachować porządek w usłudze StackOverflow bez bałaganu związanego z tego rodzaju zhakowanymi odpowiedziami. Nie możemy powiedzieć RTFM, ale nawet szybkie spojrzenie naString
dokumentację pomogłoby uniknąć takiej odpowiedzi ...