Преобразование строки из snake_case в CamelCase в Ruby - PullRequest
152 голосов
/ 02 марта 2012

Я пытаюсь преобразовать имя из случая змеи в дело верблюда.Существуют ли какие-либо встроенные методы?

Например: "app_user" до "AppUser"

(у меня есть строка "app_user" Я хочу преобразовать это в модель AppUser).

Ответы [ 8 ]

222 голосов
/ 02 марта 2012

Если вы используете Rails, String # camelize - это то, что вы ищете.

  "active_record".camelize                # => "ActiveRecord"
  "active_record".camelize(:lower)        # => "activeRecord"

Если вы хотите получить реальный класс, вы должны использовать String # constantize поверх этого.

"app_user".camelize.constantize
108 голосов
/ 23 июля 2014

Как насчет этого?

"hello_world".split('_').collect(&:capitalize).join #=> "HelloWorld"

Найдено в комментариях здесь: Классифицируйте строку Ruby

См. Комментарий Уэйн Конрад

40 голосов
/ 02 марта 2012

Используйте classify.Хорошо обрабатывает крайние случаи.

"app_user".classify # => AppUser
"user_links".classify   # => UserLink

Примечание:

Этот ответ является специфическим для описания, данного в вопросе (он не является специфичным для названия вопроса).Если кто-то пытается преобразовать строку в случай верблюда, он должен использовать ответ Sergio .Спрашивающий заявляет, что он хочет преобразовать app_user в AppUser (не App_user), следовательно, этот ответ ..

23 голосов
/ 10 июля 2012

Источник: http://rubydoc.info/gems/extlib/0.9.15/String#camel_case-instance_method

Для целей обучения:

class String
  def camel_case
    return self if self !~ /_/ && self =~ /[A-Z]+.*/
    split('_').map{|e| e.capitalize}.join
  end
end

"foo_bar".camel_case          #=> "FooBar"

И для варианта в нижнем регистре:

class String
  def camel_case_lower
    self.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
  end
end

"foo_bar".camel_case_lower          #=> "fooBar"
15 голосов
/ 27 сентября 2016

Тест для чистых решений Ruby

Я использовал все возможности, которые я имел в виду, чтобы сделать это с чистым кодом ruby, вот они:

  • прописные буквы и gsub

    "app_user".capitalize.gsub(/_(\w)/){$1.upcase}
    
  • разделить и отобразить с помощью & стенограммы (благодаря ответу пользователя 3869936)

    "app_user".split('_').map(&:capitalize).join
    
  • разделить и отобразить (благодаря г-нуОтвет черных)

    "app_user".split('_').map{|e| e.capitalize}.join
    

И вот эталонный тест для всего этого, мы можем видеть, что gsub довольно плох для этого.Я использовал 126 080 слов.

                              user     system      total        real
capitalize and gsub  :      0.360000   0.000000   0.360000 (  0.357472)
split and map, with &:      0.190000   0.000000   0.190000 (  0.189493)
split and map        :      0.170000   0.000000   0.170000 (  0.171859)
9 голосов
/ 07 мая 2013

Я пришел сюда, чтобы найти обратный твой вопрос: от верблюжьей до змеиной. Для этого используйте подчеркивание (не декамелизировать):

AppUser.name.underscore # => "app_user"

или, если у вас уже есть строка с верблюжьим регистром:

"AppUser".underscore # => "app_user"

или, если вы хотите получить имя таблицы, возможно, поэтому вам нужен случай со змеей:

AppUser.name.tableize # => "app_users"

2 голосов
/ 16 января 2018

Я чувствую себя немного неловко, чтобы добавить больше ответов здесь.Решил пойти на самый читабельный и минимальный чистый рубиновый подход, игнорируя хороший тест @ ulysse-bn.В то время как режим :class является копией @ user3869936, режим :method я не вижу ни в одном другом ответе здесь.

0 голосов
/ 15 декабря 2013

Большинство других методов, перечисленных здесь, специфичны для Rails.Если вы хотите сделать это с чистым Ruby, ниже приведен самый краткий способ, которым я придумал (спасибо @ ulysse-bn за предложенное улучшение)

x="this_should_be_camel_case"
x.gsub(/(?:_|^)(\w)/){$1.upcase}
    #=> "ThisShouldBeCamelCase"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...