프로그래밍 방식으로 클래스 이름 FooBar
을 기호 :foo_bar
으로 바꿀 수 있습니까? 예 : 이런 식으로,하지만 그 낙타 사건을 제대로 처리합니까?Ruby 클래스 이름을 밑줄 구분 기호로 변환하려면 어떻게해야합니까?
FooBar.to_s.downcase.to_sym
프로그래밍 방식으로 클래스 이름 FooBar
을 기호 :foo_bar
으로 바꿀 수 있습니까? 예 : 이런 식으로,하지만 그 낙타 사건을 제대로 처리합니까?Ruby 클래스 이름을 밑줄 구분 기호로 변환하려면 어떻게해야합니까?
FooBar.to_s.downcase.to_sym
레일 당신이 underscore_separated 문자열로 낙타 표기법 문자열을 변환 할 수 underscore
라는 메소드와 함께 제공 activesupport 보석 설치합니다.
FooBar.name.underscore.to_sym
그러나 ipsum의 말씀대로, ActiveSupport 그냥 그렇게 설치해야합니다 : 그래서 당신은이 작업을 수행 할 수 있습니다.
당신은 단지 그것을 위해 ActiveSupport를 설치하지 않으려면
, 당신은String
자신에 원숭이 패치
underscore
을 할 수 있습니다 (밑줄 기능은
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
첫째 :
require 'rubygems'
require 'active_support'
"FooBar".underscore.to_sym
클래스 (상수)를 심볼로 변환하려고하므로'FooBar.to_s.underscore.to_sym'이되어야합니다.이 팩토리는 [Factory Girl] (https : // github .com/thoughtbot/factory_girl). :) –
내가 들어갑니다 내용은 다음과 같습니다
레일 4module 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
ActiveSupport는'String' # demodulize를 가지고 있는데, 이는 :: :: 전에 부분을 제거합니다. – amoebe
@amoebe - 정보 주셔서 감사합니다. 비록 당신이 일하는가에 달려 있습니다 - 당신은 레일 앱 (또는 심지어 웹 앱)에서 작업하지 않을 수도 있습니다. –
MODEL_NAME가 포함 된 ActiveModel::Name
객체가 유용 더 "의 의미는"등을 여러 속성을 반환합니다 :
FooBar.model_name.param_key
#=> "foo_bar"
FooBar.model_name.route_key
#=> "foo_bars"
FooBar.model_name.human
#=> "Foo bar"
원하는 의미와 일치하는 경우 그 중 하나를 사용해야합니다. 장점 :
BTW, human
은 I18N을 인식 할 수있는 장점이 있습니다.
'model_name'도 인스턴스 개체에 적용됩니다. 예 :'foo_bar.model_name'. 전체 목록에서 레일즈 콘솔이나 디버거에'foo_bar.model_name.inspect'라고 쓰려면 – ivanxuu
감사합니다. 나는 이것이 Rails 확장 일까 두려웠다. :) 실제로 레일즈를 사용하고 있으므로 걱정할 필요가 없습니다. –
그러면 질문에 적절하게 태그를 붙여야합니다. 여기, 당신을 위해 그것을 해 드리겠습니다. – kikito
아니요, ActiveRecord가 아닙니다. ActiveSupport. –