Я пытаюсь заставить направляющие использовать для своей выгоды первый символ строки и оставлять все другими способ, которым они. Я сталкиваюсь с проблемой, где "я из Нью-Йорка", превращен, "я из Нью-Йорка".
Какой метод я использовал бы для выбора первого символа?
Спасибо
Править: Я пытался реализовать, какие предложенные macek, но я получаю "неопределенный метод, 'используют для своей выгоды'" ошибку. Код хорошо работает без использовать для своей выгоды строки. Спасибо за справку!
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: редактирование Испытанного macek и все еще получение неопределенного метода 'используют для своей выгоды'" ошибку. Что я мог делать неправильно?
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 в Вас, это превращает y в 121
self.title[0] = title[0].to_s.capitalize
Заголовок будет писать каждое слово с заглавной буквы. Эта строка кажется объемной, но гарантирует, что единственная измененная буква - первая.
new_string = string.slice(0,1).capitalize + string.slice(1..-1)
Обновление:
irb(main):001:0> string = "i'm from New York..."
=> "i'm from New York..."
irb(main):002:0> new_string = string.slice(0,1).capitalize + string.slice(1..-1)
=> "I'm from New York..."
Кажется, я не могу воспроизвести вашу проблему. Продолжайте и запустите этот собственный сценарий Ruby. Он генерирует точный результат, который вы ищете, и Rails поддерживает все эти методы. С какими входами у вас проблемы?
#!/usr/bin/ruby
def fixlistname(title)
title = title.lstrip
title += '...' unless title =~ /\.{3}$/
title[0] = title[0].capitalize
raise 'Title must start with "You know you..."' unless title =~ /^You know you/
title
end
DATA.each do |title|
puts fixlistname(title)
end
__END__
you know you something WITH dots ...
you know you something WITHOUT the dots
you know you something with LEADING whitespace...
you know you something with whitespace BUT NO DOTS
this generates error because it doesn't start with you know you
You know you something WITH dots ...
You know you something WITHOUT the dots...
You know you something with LEADING whitespace...
You know you something with whitespace BUT NO DOTS...
RuntimeError: Title must start with "You know you..."
На основе вашего редактирования вы можете попробовать что-то вроде этого.
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
Это поможет.
s = "i'm from New York"
s[0] = s[0].capitalize
#=> I'm from New York
При попытке использовать String # capitalize
для всей строки вы видели Я из Нью-Йорка
, потому что method:
Возвращает копию str с первым символом, преобразованным в верхний регистр, а остаток в нижний регистр.
"hello".capitalize #=> "Hello"
"HELLO".capitalize #=> "Hello"
"123ABC".capitalize #=> "123abc"
string = "i'm from New York"
string.split(/\s+/).each{ |word,i| word.capitalize! unless i > 0 }.join(' ')
# => I'm from New York