Ich versuche, Rails dazu zu bringen, das erste Zeichen einer Zeichenfolge groß zu schreiben und alle anderen so zu belassen, wie sie sind. Ich habe ein Problem, bei dem aus "Ich komme aus New York" "Ich komme aus New York" wird.
Mit welcher Methode würde ich das erste Zeichen auswählen?
Vielen Dank
BEARBEITEN: Ich habe versucht zu implementieren, was macek vorgeschlagen hat, aber ich erhalte den Fehler "undefinierte Methode" großschreiben "" . Der Code funktioniert ohne Groß- und Kleinschreibung. Danke für die Hilfe!
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: Hat es funktioniert. Danke für die Hilfe!
EDIT 3: Warten Sie, nein, ich habe nicht ... Hier ist, was ich in meinem Listenmodell habe.
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: Versucht, Macek zu bearbeiten und trotzdem einen undefinierten Methodenfehler zu erhalten . Was könnte ich falsch machen?
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: Das ist komisch. Ich kann den undefinierten Methodenfehler mithilfe der folgenden Zeile beseitigen. Das Problem ist, dass es scheint, den ersten Buchstaben durch eine Zahl zu ersetzen. Anstatt beispielsweise das y in You groß zu schreiben , verwandelt es das y in ein 121
self.title[0] = title[0].to_s.capitalize
quelle
EDIT 3
müssen Sie Zeile 2 mit beginnenself.title =
. Außerdem benötigen Sie in allen drei Zeilen nurself.title
links von einem=
(Gleichheitszeichen). An anderen Stellen können Sie einfach verwendentitle
. Ein Beispiel finden Sie in der Bearbeitung meiner Antwort.Antworten:
Titleize wird jedes Wort groß schreiben. Diese Zeile fühlt sich kräftig an, garantiert aber, dass der einzige geänderte Buchstabe der erste ist.
Aktualisieren:
quelle
s[0].capitalize + s[1..-1] if s.present?
Dies sollte es tun:
quelle
title[0] = title[0].capitalize
title.first.capitalize!
capitalize
konvertiert alle Buchstaben nach dem ersten Buchstaben in Kleinbuchstaben, sodass dies für die in der Frage dargestellte Zeichenfolge ("Ich komme aus New York") nicht funktioniert.Sie können humanisieren verwenden. Wenn Sie keine Unterstriche oder andere Großbuchstaben in Ihren Textzeilen benötigen.
Eingang:
Ausgabe:
quelle
humanize
ist die Rails genau ActiveSupport-Methode. Einfacher Rubin kann das nicht.quelle
^
bedeutet Zeilenanfang"\nfoo"
wird"\nFoo"
. Das ist wahrscheinlich für die meisten Anwendungsfälle in Ordnung. Da es einsub
und kein istgsub
, wird auch bei mehrzeiligen Zeichenfolgen nur ein Buchstabe in Großbuchstaben geschrieben.str.sub(/\S/, &:upcase)
, wodurch das erste Nicht-Leerzeichen gefunden und in Großbuchstaben geschrieben wird.Ab Rails 5.0.0.beta4 können Sie die neue
String#upcase_first
Methode verwenden oder diesActiveSupport::Inflector#upcase_first
tun. Überprüfen Sie diesen Blog-Beitrag für weitere Informationen.quelle
Eine objektorientierte Lösung:
Dann können Sie einfach Folgendes tun:
quelle
String
Klassenerweiterung geschrieben.quelle
Bearbeiten 2
Ich kann Ihre Probleme nicht wiederholen. Führen Sie dieses native Ruby-Skript aus. Es generiert genau die Ausgabe, nach der Sie suchen, und Rails unterstützt alle diese Methoden. Mit welchen Eingängen haben Sie Probleme?
Ausgabe
Bearbeiten
Basierend auf Ihrer Bearbeitung können Sie so etwas ausprobieren.
Original
Dies wird den Trick machen
Beim Versuch,
String#capitalize
die gesamte Zeichenfolge zu verwenden, wurde FolgendesI'm from new york
angezeigt:quelle
quelle
Bei den meisten dieser Antworten wird die Zeichenfolge an Ort und Stelle bearbeitet. Wenn Sie nur für die Ansichtsausgabe formatieren, möchten Sie möglicherweise die zugrunde liegende Zeichenfolge nicht ändern, damit Sie
tap
nach adup
eine bearbeitete Kopie erhalten könnenquelle
Wenn und nur wenn OP Affen-Patches für String-Objekte durchführen möchte, kann dies verwendet werden
Verwenden Sie es jetzt:
quelle
Eine noch kürzere Version könnte sein:
quelle
Niemand hat gsub erwähnt, wodurch Sie dies präzise tun können.
Beispiel:
quelle
Vielleicht der einfachste Weg.
quelle
Beachten Sie, dass die
s[0] = ...
Lösung nicht ausreicht , wenn Sie sich mit Multi-Byte-Zeichen befassen müssen, dh wenn Sie Ihre Site internationalisieren müssen. Diese Frage zum Stapelüberlauf schlägt vor, das Unicode-Util-Juwel zu verwendenRuby 1.9: Wie kann ich Multibyte-Strings richtig auf- und abstellen?
BEARBEITEN
Ein einfacher Weg, um zumindest seltsame String-Codierungen zu vermeiden, ist die Verwendung von String # mb_chars :
quelle
Was ist mit der Klassifizierungsmethode für Zeichenfolgen?
Ausgabe:
quelle
"hello worlds".classify # => "Hello world"
quelle
string[i]
es nicht in anderen Sprachen funktioniert. Bitte helfen Sie dabei, StackOverflow frei von solchen gehackten Antworten zu halten. Wir können nicht RTFM sagen, aber selbst ein kurzer Blick auf dieString
Dokumente hätte geholfen, eine Antwort wie diese zu vermeiden ...