Использовать только первый символ строки и оставлять других в покое? (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 ]

120 голосов
/ 22 августа 2011

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

title = "test test"     
title[0] = title[0].capitalize
puts title # "Test test"
91 голосов
/ 15 апреля 2010

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

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..."
56 голосов
/ 28 июня 2012

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

Введите:

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

Выход:

"I'm from new york..."
43 голосов
/ 15 марта 2013
str = "this is a Test"
str.sub(/^./, &:upcase)
# => "This is a Test"
31 голосов
/ 20 мая 2016

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

14 голосов
/ 14 сентября 2012

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

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

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

"i'm from New York".capitalize_first_char
7 голосов
/ 09 февраля 2016
str.sub(/./, &:capitalize)
6 голосов
/ 26 мая 2014
my_string = "hello, World"
my_string.sub(/\S/, &:upcase) # => "Hello, World"
6 голосов
/ 15 апреля 2010

Редактировать 2

Я не могу повторить твою проблему. Иди вперед и запусти этот родной скрипт 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

Оригинал * * 1016 Это сделает свое дело 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"

4 голосов
/ 02 января 2013

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

'test'.dup.tap { |string| string[0] = string[0].upcase }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...