Использовать только первый символ строки и оставить других в одиночку? (Rails)

Я пытаюсь заставить Rails использовать первый символ строки и оставить всех остальных такими, какие они есть. Я столкнулся с проблемой, когда "я из Нью-Йорка" превращается в "Я из Нью-Йорка".

Какой метод я использовал бы для выбора первого символа?

Спасибо

РЕДАКТИРОВАТЬ: Я попытался реализовать то, что предложил мацек, но я получаю ошибку "

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 и все еще получение ошибки `w91 > ` capize '. Что я могу делать неправильно?

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: Это странно. Я могу избавиться от ошибки метода undefined, используя приведенную ниже строку. Проблема в том, что она, кажется, заменяет первую букву числом. Например, вместо того, чтобы заглаживать y в You, он превращает y в 121

self.title[0] = title[0].to_s.capitalize

Ответ 1

Titleize будет использовать каждое слово. Эта линия чувствует себя здоровенно, но гарантирует, что единственное письмо изменено - это первое.

new_string = string.slice(0,1).capitalize + string.slice(1..-1)

Update:

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..."

Ответ 2

Это должно сделать это:

title = "test test"     
title[0] = title[0].capitalize
puts title # "Test test"

Ответ 3

Вы можете использовать гуманизацию. Если вам не нужны символы подчеркивания или другие столицы в текстовых строках.

Input:

"i'm from New_York...".humanize

Вывод:

"I'm from new york..."

Ответ 4

str = "this is a Test"
str.sub(/^./, &:upcase)
# => "This is a Test"

Ответ 5

В качестве Rails 5.0.0.beta4 вы можете использовать новый метод String#upcase_first или ActiveSupport::Inflector#upcase_first для этого. Подробнее см. сообщение в блоге.

Ответ 6

Объектно-ориентированное решение:

class String
  def capitalize_first_char
    self.sub(/^(.)/) { $1.capitalize }
  end
end

Тогда вы можете просто сделать это:

"i'm from New York".capitalize_first_char

Ответ 7

str.sub(/./, &:capitalize)

Ответ 8

Изменить 2

Я не могу повторить вашу проблему. Идем дальше и запускаем этот родной Ruby script. Он генерирует точный результат, который вы ищете, и 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 для всей строки вы видите I'm from new york, потому что метод:

Возвращает копию str с первым символом, преобразованным в верхний регистр, а остальное - в нижний регистр.

"hello".capitalize    #=> "Hello"
"HELLO".capitalize    #=> "Hello"
"123ABC".capitalize   #=> "123abc"

Ответ 9

my_string = "hello, World"
my_string.sub(/\S/, &:upcase) # => "Hello, World"

Ответ 10

Большинство этих ответов редактируют строку на месте, когда вы просто форматируете вывод для представления, вы можете не захотеть изменять базовую строку, чтобы вы могли использовать tap после dup для получения отредактированной копии

'test'.dup.tap { |string| string[0] = string[0].upcase }

Ответ 11

В том и только в том случае, если OP захочет выполнить патч обезьяны на объекте String, тогда это можно использовать

class String
  # Only capitalize first letter of a string
  def capitalize_first
    self.sub(/\S/, &:upcase)
  end
end

Теперь используйте его:

"i live in New York".capitalize_first #=> I live in New York

Ответ 12

Никто не упоминает gsub, который позволяет вам сделать это кратко.

string.gsub(/^([a-z])/) { $1.capitalize }

Пример:

 > 'caps lock must go'.gsub(/^(.)/) { $1.capitalize }
=> "Caps lock must go"

Ответ 13

Еще более короткая версия может быть:

s = "i'm from New York..."
s[0] = s.capitalize[0]

Ответ 14

Обратите внимание, что если вам нужно иметь дело с многобайтовыми символами, т.е. Если вы хотите интернационализировать свой сайт, решение s[0] =... не будет подходящим. Этот вопрос предлагает использовать гем unicode-util

Ruby 1.9: как правильно прописать и перебрать многобайтовые строки?

РЕДАКТИРОВАТЬ

На самом деле более простой способ, по крайней мере, избежать странного кодирования строк, это просто использовать String # mb_chars:

s = s.mb_chars
s[0] = s.first.upcase
s.to_s

Ответ 15

Возможно, самый простой способ.

s = "test string"
s[0] = s[0].upcase
# => "Test string"

Ответ 16

Как насчет классификации метода в строке?

'somESTRIng'.classify

выход:

#rails => 'SomESTRIng'

Ответ 17

string = "i'm from New York"
string.split(/\s+/).each{ |word,i| word.capitalize! unless i > 0 }.join(' ')
# => I'm from New York