2011-04-11 5 views

답변

116

레일 당신이 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 
+1

감사합니다. 나는 이것이 Rails 확장 일까 두려웠다. :) 실제로 레일즈를 사용하고 있으므로 걱정할 필요가 없습니다. –

+2

그러면 질문에 적절하게 태그를 붙여야합니다. 여기, 당신을 위해 그것을 해 드리겠습니다. – kikito

+5

아니요, ActiveRecord가 아닙니다. ActiveSupport. –

6

첫째 :

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

클래스 (상수)를 심볼로 변환하려고하므로'FooBar.to_s.underscore.to_sym'이되어야합니다.이 팩토리는 [Factory Girl] (https : // github .com/thoughtbot/factory_girl). :) –

1

내가 들어갑니다 내용은 다음과 같습니다

레일 4
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 
+1

ActiveSupport는'String' # demodulize를 가지고 있는데, 이는 :: :: 전에 부분을 제거합니다. – amoebe

+0

@amoebe - 정보 주셔서 감사합니다. 비록 당신이 일하는가에 달려 있습니다 - 당신은 레일 앱 (또는 심지어 웹 앱)에서 작업하지 않을 수도 있습니다. –

52

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을 인식 할 수있는 장점이 있습니다.

+0

'model_name'도 인스턴스 개체에 적용됩니다. 예 :'foo_bar.model_name'. 전체 목록에서 레일즈 콘솔이나 디버거에'foo_bar.model_name.inspect'라고 쓰려면 – ivanxuu

관련 문제