Ruby on Rails не пишет заглавную первую букву

Я использую Rails 2.3.2.

Как преобразовать "Cool" в "cool"? Я знаю, что "Cool".downcase работает, но есть ли метод Ruby/Rails, который делает противоположное capitalize, то есть uncapitalize или decapitalize?


person ma11hew28    schedule 17.12.2010    source источник


Ответы (9)


Нет обратного capitalize, но вы можете свободно сворачивать свои собственные:

class String
  def uncapitalize 
    self[0, 1].downcase + self[1..-1]
  end
end
person Jacob Relkin    schedule 17.12.2010
comment
Где мы должны добавить этот метод? - person Vadorequest; 16.07.2014
comment
@Vadorequest Метод? Добавьте его в класс String, как показано в ответе. - person Ajedi32; 08.08.2014
comment
В стандартном приложении Rails, вероятно, имеет смысл добавить его в новый файл в /config/initializers. - person DaveMongoose; 08.08.2014
comment
@ Ajedi32 Ну, может быть, вам это кажется очевидным, но не мне. Спасибо, Дэйв. - person Vadorequest; 10.08.2014

Существует также:

"coolat_cat".camelize(:lower) # => "coolCat"
person tfischbach    schedule 26.10.2012
comment
Для этого требуется ActiveRecord, хотя: apidock.com/rails/String/camelize (после прочтения вопроса , там указано, что он уже с Rails) - person Ian Vaughan; 29.05.2013
comment
@Ian Vaughan: ActiveSupport, если быть точнее - person tfischbach; 29.05.2013
comment
Они обновили сигнатуру метода до версии 4.2.7. Теперь он принимает логическое значение, например camelize(uppercase_first_letter = true) apidock.com/rails/v4.2.7/String/ верблюд - person animatedgif; 15.11.2016
comment
@animatedgif существует два метода: Inflector.#camelize(term , uppercase_first_letter), который принимает строку для камелизации и логическое значение, String#camelize(first_letter), которая превращает self в верблюжью и принимает символ :upper или :lower. Я думаю, что документы apidock ошибочны. - person David Moles; 15.12.2016
comment
Определенно вещь рельсов, но, черт возьми, приятно иметь! - person Dan Bradbury; 13.03.2017

Вы также можете сделать это с помощью простого sub:

"Cool".sub(/^[A-Z]/) {|f| f.downcase }
person JP.    schedule 01.02.2013
comment
обратите внимание, что "Cool".sub(/^[A-Z]/, &:downcase) достаточно - person astreal; 16.06.2015

Настоящей инверсии прописной буквы нет, но я думаю, что underscore подходит близко.

"CoolCat".underscore  #=> "cool_cat"
"cool_cat".capitalize #=> "Cool_cat"
"cool_cat".camelize   #=> "CoolCat"

Редактировать: underscore, конечно, является инверсией camelize, а не capitalize.

person iain    schedule 17.12.2010

Существует инверсия capitalize, называемая swapcase:

"Cool Cat".swapcase   #=> "cOOL cAT"
person Nitin Savant    schedule 28.10.2016

Вы можете использовать тап (чтобы он помещался на одной строке):

"JonSkeet".tap { |e| e[0] = e[0].downcase } # => "jonSkeet"
person Benjamin Crouzier    schedule 21.03.2016

Если вы используете Ruby Facets, вы можете сделать первую букву строчной:

https://github.com/rubyworks/facets/blob/master/lib/core/facets/string/uppercase.rb

person rmk    schedule 17.12.2010

Попробуй это

'Cool'.sub(/^([A-Z])/) { $1.tr!('[A-Z]', '[a-z]') }

https://apidock.com/ruby/XSD/CodeGen/GenSupport/uncapitalize

person Rahul Patel    schedule 30.05.2017

person    schedule
comment
Это не только самый читаемый метод, но также и самый производительный, даже если вы защитите его каким-либо тернарным оператором или оператором if, чтобы гарантировать, что str не равен нулю. Это должен быть принятый ответ. Спасибо @boulder_ruby - person Freddo; 10.04.2016