Использовать только первый символ строки и оставлять других в покое? (Rails) - PullRequest
97 голосов
/ 15 апреля 2010

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

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

Спасибо

РЕДАКТИРОВАТЬ: Я пытался реализовать то, что предложил 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 в You он превращает y в 121

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

Ответы [ 17 ]

3 голосов
/ 13 ноября 2015

Если и только если 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
2 голосов
/ 09 декабря 2011

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

s = "i'm from New York..."
s[0] = s.capitalize[0]
2 голосов
/ 05 июня 2012

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

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

Пример:

 > 'caps lock must go'.gsub(/^(.)/) { $1.capitalize }
=> "Caps lock must go"
1 голос
/ 09 октября 2013

Пожалуй, самый простой способ.

s = "test string"
s[0] = s[0].upcase
# => "Test string"
1 голос
/ 08 мая 2012

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

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

EDIT

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

s = s.mb_chars
s[0] = s.first.upcase
s.to_s
0 голосов
/ 15 апреля 2010
string = "i'm from New York"
string.split(/\s+/).each{ |word,i| word.capitalize! unless i > 0 }.join(' ')
# => I'm from New York
0 голосов
/ 15 мая 2014

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

'somESTRIng'.classify

выход:

#rails => 'SomESTRIng'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...