반응형
Ruby 클래스 이름을 밑줄로 구분 된 기호로 어떻게 변환합니까?
프로그래밍 방식으로 클래스 이름을 FooBar
기호로 바꾸려면 어떻게 :foo_bar
해야합니까? 예를 들어 이와 같은 것이지만 낙타 케이스를 제대로 처리합니까?
FooBar.to_s.downcase.to_sym
Rails에는 underscore
CamelCased 문자열을 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
반응형
'programing tip' 카테고리의 다른 글
@ Html.HiddenFor는 ASP.NET MVC의 목록에서 작동하지 않습니다. (0) | 2020.09.07 |
---|---|
WAMP가 녹색으로 바뀌지 않습니다. (0) | 2020.09.07 |
SpringData 저장소는 실제로 어떻게 구현됩니까? (0) | 2020.09.06 |
sizeof (char)! = 1 또는 최소한 CHAR_BIT> 8 인 기계가 있습니까? (0) | 2020.09.06 |
Ruby on Rails 3를 사용하여 모듈을 만들고 사용하는 방법은 무엇입니까? (0) | 2020.09.06 |