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

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

FooBar.to_s.downcase.to_sym



답변

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


답변

레일스 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을 인식하는 이점이 있습니다.


답변

첫째 : gem install activesupport

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


답변

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

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


답변