Ruby 클래스 이름을 밑줄로 구분 된 기호로 어떻게 변환합니까?


95

프로그래밍 방식으로 클래스 이름을 FooBar기호로 바꾸려면 어떻게 :foo_bar해야합니까? 예를 들어 이와 같은 것이지만 낙타 케이스를 제대로 처리합니까?

FooBar.to_s.downcase.to_sym

답변:


141

Rails에는 underscoreCamelCased 문자열을 underscore_separated 문자열로 변환 할 수 있는 메서드 가 있습니다. 따라서 다음과 같이 할 수 있습니다.

FooBar.name.underscore.to_sym

하지만 ipsum이 말했듯이 그렇게하려면 ActiveSupport를 설치해야합니다.

이를 위해 ActiveSupport를 설치하지 않으려면 직접 원숭이 패치 underscore를 적용 할 수 있습니다 String(밑줄 기능은 ActiveSupport :: Inflector에 정의되어 있음 ).

class String
  def underscore
    word = self.dup
    word.gsub!(/::/, '/')
    word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
    word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
    word.tr!("-", "_")
    word.downcase!
    word
  end
end

1
감사. 이것이 Rails 확장 인 것이 두려웠습니다. :) 실제로 Rails를 사용하고 있으므로 걱정하지 마십시오.
Josh Glover 2011

2
그런 다음 그에 따라 질문에 태그를 지정해야합니다. 여기, 내가 당신을 위해 그것을하겠습니다 ...
kikito 2011-04-11

5
아니요, ActiveRecord가 아닙니다. ActiveSupport.
Henrichs 고삐

실제로, 그것을 변경하겠습니다
kikito 2011-04-11

2
반대로하는 방법?
user1406062 2013 년

72

레일스 4 .model_name

Rails 4에서는 다음 ActiveModel::Name과 같은 더 많은 유용한 "의미 적"속성을 포함 하는 객체를 반환합니다 .

FooBar.model_name.param_key
#=> "foo_bar"

FooBar.model_name.route_key
#=> "foo_bars"

FooBar.model_name.human
#=> "Foo bar"

따라서 원하는 의미와 일치하는 경우 그중 하나를 사용해야합니다. 장점 :

  • 코드를 더 쉽게 이해
  • Rails가 이름 지정 규칙을 변경하기로 결정한 (가능성이 낮은) 이벤트에서도 앱은 계속 작동합니다.

BTW human는 I18N을 인식하는 이점이 있습니다.


model_name인스턴스 객체에도 작동합니다. 예 : foo_bar.model_name. 당신은 전체 목록 쓰기하려면 foo_bar.model_name.inspect레일 콘솔 또는 디버거
ivanxuu

그리고 나는 반대 / 반대를 찾고 있었는데 classify, modelize작동하지 않는 것 같았습니다.
Pysis

7

첫째 : gem install activesupport

require 'rubygems'
require 'active_support'
"FooBar".underscore.to_sym

이어야 FooBar.to_s.underscore.to_sym합니다. 클래스 (상수)를 심볼로 변환하려고하므로 Factory Girl에 피드 할 수 있습니다 . :)
Josh Glover 2011

2

내가했던 것은 다음과 같습니다.

module MyModule
  module ClassMethods
    def class_to_sym  
      name_without_namespace = name.split("::").last
      name_without_namespace.gsub(/([^\^])([A-Z])/,'\1_\2').downcase.to_sym
    end
  end

  def self.included(base)
    base.extend(ClassMethods)
  end
end

class ThisIsMyClass
  include MyModule
end 

ThisIsMyClass.class_to_sym #:this_is_my_class

3
ActiveSupport는 String#demodulize이전에 부품을 제거합니다 ::.
amoebe 2015-09-29

@amoebe-정보 주셔서 감사합니다. 하지만 작업하는 내용에 따라 레일스 앱 (또는 웹 앱)에서 작업하지 않을 수 있습니다.
Louis Sayers 2015 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.