只把string的第一个字符大写,留下别人一个人? (导轨)

我试图让Rails利用string的第一个字符,并把所有其他的字符都保留下来。 我遇到了“我来自纽约”的问题变成了“我来自纽约”。

我会用什么方法select第一个字符?

谢谢

编辑:我试图实施什么macekbuild议,但我得到一个“未定义的方法`大写'”错误。 代码工作正常,没有大写的行。 谢谢您的帮助!

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:这很奇怪。 我能够通过使用下面的行来摆脱未定义的方法错误。 问题是,它似乎用一个数字replace第一个字母。 例如,不是把y变成大写,而是把y变成121

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

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

这应该做到这一点:

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

你可以使用人性化。 如果您不需要在文本行中使用下划线或其他大写字母。

input:

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

输出:

 "I'm from new york..." 
 str = "this is a Test" str.sub(/^./, &:upcase) # => "This is a Test" 

面向对象的解决scheme:

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

那么你可以这样做:

 "i'm from New York".capitalize_first_char 

从Rails 5.0.0.beta4开始,您可以使用新的String#upcase_first方法或ActiveSupport::Inflector#upcase_first来执行此操作。 检查这个博客文章了解更多信息。

编辑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整个string,你看到I'm from new york因为方法:

返回str的一个副本,第一个字符转换为大写,其余部分转换为小写。

 "hello".capitalize #=> "Hello" "HELLO".capitalize #=> "Hello" "123ABC".capitalize #=> "123abc" 
 my_string = "hello, World" my_string.sub(/\S/, &:upcase) # => "Hello, World" 
 str.sub(/./, &:capitalize) 

这些答案中的大多数编辑string的地方,当你只是格式化视图输出,你可能不希望改变底层的string,所以你可以使用tap一个dup后得到一个编辑的副本

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

当且仅当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 

没有人提到gsub,它可以让你简洁地做到这一点。

 string.gsub(/^([az])/) { $1.capitalize } 

例:

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

更短的版本可能是:

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

请注意,如果您需要处理多字节字符,即如果您必须国际化您的网站, s[0] = ...解决scheme将是不够的。 这个SO问题build议使用unicode-util gem

Ruby 1.9:我怎样才能正确地提升和取消多字节string?

编辑

其实一个至less避免奇怪string编码的简单方法就是使用String#mb_chars :

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

也许是最简单的方法。

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

怎么样的string分类方法?

 'somESTRIng'.classify 

输出:

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