2011-12-15 1 views

답변

3

당신이 사용할 수있는 constantize 방법, 같은 :

controller_name.constantize 

내가 방법을 잘 모르겠어요하지만 네임 스페이스가있는 컨트롤러가 있으면 작동합니다.

업데이트 : 하나는 모든 컨트롤러의 이름 및/또는 네임 스페이스에 대해 작동하지 않습니다

. 하나 #class와 조합 #controller 방법을 사용할 수 있지만 : 순수 루비에서

controller.class 
+0

'controller_name'은 도움이되지 않습니다. 원인 :'Admin :: PostsController'는 간단히'posts '. 그것을 콘스탄트 화하면 컨트롤러를 검색하기에 충분하지 않은'Posts'가 반환됩니다. – Kostas

+1

네 말이 맞아! 방금보기에서'controller.class'를 테스트했으며, 네임 스페이스 (namespaced)조차도 작동하는 것처럼 보입니다. 노력하고 있니? – tbuehlmann

+1

정말 대단합니다. plz는 마크에 대한 답을 수락 한대로 편집합니다. – Kostas

1

를, 클래스 이름은 상수이기 때문에, 당신은 문자열에서 클래스를 얻기 위해이 작업을 수행 할 수 있습니다

classname = 'Posts' 
p Kernel.const_get(classname).methods 

가있다 단지 이것에 대한 레일에 좋은 바로 가기, constantize : 클래스 명 먼저전화, 예를 들어 'editable_file'

p 'Posts'.constantize.methods 

경우방법 :

p 'editable_file'.camelize.constantize # EditableFile 
p 'extensions/editable_file'.camelize.constantize # Extensions::EditableFile 

이 편집 : 당신이 정말로 해제 demodulized 컨트롤러 이름을 얻고 싶은 경우에, config/initializers/controller_name.rb에서이 코드를 확인해야합니다 :

class ActionController::Metal 
    def self.controller_name 
    # @controller_name ||= self.name.demodulize.sub(/Controller$/, '').underscore 
    @controller_name ||= self.name.sub(/Controller$/, '').underscore 
    end 
end 
+0

하지만 어디에서 문자열을 일정하게 유지합니까? 예 : "Admin :: PostsController"? – Kostas

+0

그 답을 준 사람은 -1 명입니까? 이것은 좀 더 알고 싶어하는 모든 사람들에게 타당하고 훌륭한 정보입니다. 및 문자열, vrinek, 당신은 귀하의 질문에 명시된대로 'controller_name'에서 얻을. –

+0

@vrinek 내 편집 된 답변보기 – maprihoda

1

전망 아마 할 필요가 없습니다 이. 이상적으로 예상하고있는 뷰에서 무엇을하려 하든지간에 컨트롤러에서 대신 수행해야합니다.

왜 이렇게하고 싶은지 생각해 보면 내가 생각할 수있는 가장 좋은 대답은 컨트롤러에서 정의한 도우미 메서드를 호출하려는 것입니다. 이 작업을 수행 할 수있는 구조가 이미 존재합니다. helper_method을 사용하십시오.

다른 무엇보다도 컨트롤러는 해당 데이터를보기에 제공해야합니다. 보기가 컨트롤러에서 꺼내지 않습니다. (예를 들어, 클래스를 필요로하지 않아도 컨트롤러는 @controller_class = self.class을 제공 할 수 있습니다. 그러면 뷰에서 사용할 수 있습니다)

+0

왜 이렇게해야하는지 궁금합니다 ... –

+0

네,하지만 도우미에서'controller_name'을 사용해야 할 수도 있습니다. 예를 들어, 나는 controller_name을 사용하여 인증 링크를 인쇄 할시기를 결정하는 user_nav 도우미를 가지고있다. – maprihoda