107

Rails で文字列の最初の文字を大文字にし、他のすべての文字はそのままにしておくようにしようとしています。「私はニューヨーク出身です」が「私はニューヨーク出身です」になってしまうという問題に直面しています。

最初の文字を選択するには、どの方法を使用しますか?

ありがとう

編集: macek が提案したものを実装しようとしましたが、「未定義のメソッド `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: macek の編集を試みましたが、まだ未定義のメソッド「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:これは奇妙です。以下の行を使用して、未定義のメソッドエラーを取り除くことができます。問題は、最初の文字を数字に置き換えているように見えることです。たとえば、Youのyを大文字にする代わりに、yを 121 に変換します。

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

19 に答える 19

131

これはそれを行う必要があります:

title = "test test"     
title[0] = title[0].capitalize
puts title # "Test test"
于 2011-08-22T17:02:08.530 に答える
96

Titleize はすべての単語を大文字にします。この行は重く感じますが、最初の文字だけが変更されることを保証します。

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..."
于 2010-04-15T16:13:46.573 に答える
55
str = "this is a Test"
str.sub(/^./, &:upcase)
# => "This is a Test"
于 2013-03-15T19:23:19.363 に答える
14

オブジェクト指向のソリューション:

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

次に、これを行うことができます:

"i'm from New York".capitalize_first_char
于 2012-09-14T19:06:15.043 に答える
7
str.sub(/./, &:capitalize)
于 2016-02-09T18:50:21.197 に答える
6

編集 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

オリジナル

これはトリックを行います

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"
于 2010-04-15T15:56:25.387 に答える
4

これらの回答のほとんどは、文字列をその場で編集します。ビュー出力用にフォーマットするだけの場合は、基になる文字列を変更したくない場合があるため、編集したコピーを取得するためtapに a の後に使用できますdup

'test'.dup.tap { |string| string[0] = string[0].upcase }
于 2013-01-02T13:26:31.677 に答える
3

これを簡潔に行うことができるgsubについては誰も言及していません。

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

例:

 > 'caps lock must go'.gsub(/^(.)/) { $1.capitalize }
=> "Caps lock must go"
于 2012-06-05T02:42:53.407 に答える
2

さらに短いバージョンは次のようになります。

s = "i'm from New York..."
s[0] = s.capitalize[0]
于 2011-12-09T07:52:01.137 に答える
1

おそらく最も簡単な方法です。

s = "test string"
s[0] = s[0].upcase
# => "Test string"
于 2013-10-09T09:19:26.597 に答える
1

バージョン 5.2.3 以降の Rails にはupcase_firstメソッドがあります。

たとえば、"my Test string".upcase_firstを返しMy Test stringます。

于 2020-10-31T18:52:31.460 に答える
-3
string = "i'm from New York"
string.split(/\s+/).each{ |word,i| word.capitalize! unless i > 0 }.join(' ')
# => I'm from New York
于 2010-04-15T15:41:20.600 に答える