Я пытаюсь заставить Rails использовать первый символ строки с заглавной буквы, а все остальные оставить такими, какие они есть. Я столкнулся с проблемой, когда «я из Нью-Йорка» превращается в «Я из Нью-Йорка».
Какой метод я бы использовал для выбора первого символа?
Спасибо
РЕДАКТИРОВАТЬ: Я попытался реализовать то, что предложил Мацек, но получаю ошибку «undefined method` capitalize '» . Код отлично работает без строки с заглавными буквами. Спасибо за помощь!
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
РЕДАКТИРОВАТЬ 2: Получил работу. Спасибо за помощь!
РЕДАКТИРОВАТЬ 3: Подождите, нет, я не ... Вот что у меня есть в моей модели списка.
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
РЕДАКТИРОВАТЬ 4: Пробовал редактировать мацека, но по-прежнему получаю ошибку undefined method "capitalize" . Что я делал не так?
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
РЕДАКТИРОВАТЬ 5: Это странно. Я могу избавиться от ошибки неопределенного метода, используя строку ниже. Проблема в том, что кажется, что первая буква заменяется цифрой. Например, вместо того, чтобы использовать букву y в слове You , он превращает y в 121
self.title[0] = title[0].to_s.capitalize
источник
EDIT 3
, вам нужно начать строку 2 сself.title =
. Кроме того, во всех трех строках вам нужно толькоself.title
слева от=
(знака равенства). В других местах можно просто использоватьtitle
. Смотрите редактирование моего ответа для примера.Ответы:
Заголовок будет писать каждое слово с большой буквы. Эта строка кажется объемной, но гарантирует, что единственная измененная буква - первая.
Обновить:
источник
s[0].capitalize + s[1..-1] if s.present?
Это должно сделать это:
источник
title[0] = title[0].capitalize
title.first.capitalize!
capitalize
преобразует все буквы после первой буквы в нижний регистр, поэтому это не работает для строки, представленной в вопросе («я из Нью-Йорка»).Вы можете использовать humanize. Если вам не нужны подчеркивания или другие заглавные буквы в текстовых строках.
Вход:
Вывод:
источник
humanize
осторожны , это Rails, а точнее метод ActiveSupport. Обычный рубин не может этого сделать.источник
^
означает начало строки,"\nfoo"
становится"\nFoo"
. Вероятно, это нормально для большинства случаев использования. Поскольку это a,sub
а не agsub
, он по-прежнему будет отображать только одну букву, даже с многострочными строками.str.sub(/\S/, &:upcase)
, который найдет первый непробельный символ и повысит его.Начиная с Rails 5.0.0.beta4 вы можете использовать новый
String#upcase_first
метод илиActiveSupport::Inflector#upcase_first
делать это. Проверьте это сообщение в блоге для получения дополнительной информации.источник
Объектно-ориентированное решение:
Тогда вы можете просто сделать это:
источник
String
класса.источник
Редактировать 2
Кажется, я не могу повторить вашу проблему. Продолжайте и запустите этот собственный сценарий Ruby. Он генерирует точный результат, который вы ищете, и Rails поддерживает все эти методы. С какими входами у вас проблемы?
вывод
редактировать
Основываясь на ваших изменениях, вы можете попробовать что-то вроде этого.
Оригинал
Это поможет
При попытке использовать
String#capitalize
для всей строки вы видели,I'm from new york
потому что метод:источник
источник
Большинство из этих ответов редактируют строку на месте, когда вы просто форматируете для вывода представления, вы можете не захотеть изменять базовую строку, чтобы вы могли использовать
tap
после a,dup
чтобы получить отредактированную копиюисточник
Если и только если OP захочет выполнить исправление обезьяны на объекте String, то это можно использовать
Теперь используйте это:
источник
Еще более короткая версия могла бы быть:
источник
Никто не упомянул gsub, что позволяет сделать это кратко.
Пример:
источник
Пожалуй, самый простой способ.
источник
Обратите внимание, что если вам нужно иметь дело с многобайтовыми символами, то есть если вам нужно интернационализировать свой сайт,
s[0] = ...
решение не будет адекватным. Этот вопрос о переполнении стека предлагает использовать драгоценный камень unicode-utilRuby 1.9: как правильно регистрировать и убирать многобайтовые строки?
РЕДАКТИРОВАТЬ
На самом деле более простой способ хотя бы избежать странных строковых кодировок - просто использовать String # mb_chars :
источник
А как насчет метода классификации в строке?
вывод:
источник
"hello worlds".classify # => "Hello world"
источник
string[i]
он на других языках. Пожалуйста, помогите избавить StackOverflow от таких надуманных ответов. Мы не можем сказать RTFM, но даже беглый взгляд наString
документацию помог бы избежать такого ответа ...