2012-08-15 1 views
1

레일 애플 리케이션에서 상수가 정의되어 있는지 확인하고, 필요하다면 자동 로딩을하고 싶습니다. defined? 연산자는 자동 로딩이 발생할 때까지 false를 반환합니다.이 정의 되었습니까? autoloadable 클래스에 대한

begin 
    Foo # try to autoload 
    true 
rescue NameError 
    false 
end 

상수가 정의되어 있는지 확인하는 더 나은 방법이 있나요하지만, 필요한 경우 또한이 자동로드 :

defined? Foo # => false :(
Foo # => Foo 
defined? Foo # => true 

나의 현재 해결 방법이 무엇입니까? 요청에 의해


이론적 근거 :

레일의 Konacha JS 테스트 프레임 워크가 자동으로 존재하는 경우 루비 파일 조명기를 선택해야합니다. 로딩은 Rails의 자동 로딩 메커니즘에서 이루어져야하므로 자동 로딩 (config.cache_classes = false)의 이점이 있습니다.

+0

* 이유 * 설명을하면 도움이 될 것입니다. 그것은 당신에게 더 나은 대답을 줄 수 있습니다. – deefour

+0

완료. :) ......... –

답변

1

자동로드를 시도하는 could_be_defined? 메소드를 생성하는 것처럼 들리며 표시된대로 true 또는 false을 반환합니다.

클래스를 사용하려고 시도 할 때까지 클래스가 있는지 여부를 알 수있는 방법이 없습니다. 이것은 매우 동적 인 언어의 장점 중 하나입니다. 아래쪽은 불확실성이다.

강제로드 및 테스트 방법은 확실하게 알 수있는 유일한 방법입니다. 일부 모듈은 autoload을 통해 선언 할 수 없지만 실제로 필요한 경우 즉시 생성됩니다. 존재할 수도 있고 없을 수도있는 것을 예측하려고 시도하는 것이 기껏해야 신뢰할 수 없다.

+0

흥미 롭습니다, 감사합니다. 내 코드에서 아직도 괴롭 히고있는 것은 지나치게 광범위한 NameError 구조입니다. 'Foo'를 로딩하면 모듈 정의 어딘가에 NameError가 발생하고 전파되지 않습니다. 나는 더 나은 방법 (예외 메시지를 검사하는 것의 짧은)에 관하여 확실하지 않다. –

+0

모듈을로드하면 예외가 발생하므로 문제가 아닌지 확실하지 않습니다. 그게 문제 야. 당신은 그 책임을 질 수 없습니다. – tadman

0

나는 관례에 따라 유추 된 상수를로드하는 비슷한 문제가있었습니다. 내가 가지고있는 문제는 그 클래스의 정의에서 오류가 삼켜지고 있다는 것이 었습니다. 상수가 정의되지 않은 경우

def const_presence(const_name) 
    const_name.constantize 
rescue NameError => e 
    raise e unless e.message =~ /uninitialized constant #{const_name}/ 
end 

이 전무를 반환하거나, 일정이있는 경우, 그러나 결정적으로 제기 할 상수를로드하는 동안 발생한 오류 수 :

나는이 함께했다.

관련 문제