2011-01-07 2 views
3

모델, 컨트롤러 등에 속하지 않는 사용자 정의 클래스가 있다고 가정하면이 파일을/lib에 넣어야합니다.레일로드 경로 질문

레일에서 < 3이 내 디렉토리를 내 loadpath에 추가하고 레일스 3+에서 이것을 autoload_path에 추가합니다. 이 올바른지?

이제 이미 정의 된 클래스를 확장하는 몇 가지 클래스가 있다고 가정 해 보겠습니다. 시작할 때 어디서 실행해야합니까? 예를 들어 String에 'foo'메서드를 추가하고 싶습니다.

 
class String 
    def foo 
    'foo; 
    end 
end 

시작시이 클래스를 어디에 정의해야합니까?

또 다른 이상한 버그는 내가 lib의 네임 스페이스 클래스를 만들려고 할 때입니다. 콘솔에서 이제

 
module MyProject 
class Foo 
end 
end 

:

 
ruby-1.9.2-p136 :004 > MyProject::Foo 
LoadError: Expected /Users/me/workspace/my_project/lib/foo.rb to define Foo 
from /Users/rob/.rvm/gems/ruby-1.9.2-p136/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:492:in `load_missing_constant' 
from /Users/rob/.rvm/gems/ruby-1.9.2-p136/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:183:in `block in const_missing' 

나는이 오류가 점점 계속. 이 파일을 어떻게로드 할 수 있습니까?

답변

3

당신은 일반적으로 3

이미 정의 된 클래스를 확장하기 위해 레일에 레일 2 autoload_path 당신이 응용 프로그램/기타에 넣어 수 있습니다 예를 들어, 당신이 원하는 목적지 클래스 파일을 배치하고 load_path에 디렉토리를 추가 할 수 있습니다 config/initializers 디렉토리에 파일을 넣기를 원할 것입니다.

버그를 수정하려면 foo.rb 파일에 Foo 클래스를 정의하고 모듈 이름이 일치하는지 확인해야합니다 (Bags 및 MyProject).

이름이 자동로드로 변경된 이유는 the classes in autoload_paths are actually getting autoloaded, not simply loaded입니다. 이것은 'autoload'와 'require'를 Ruby에서 사용하는 것의 차이입니다. 레일 3에서

+0

가방은 실제로 오타였습니다. 여전히 오류가 발생합니다. 다른 곳에서는 이니셜 라이저처럼 자동로드 된 파일을 둘 수 있습니까? 상수가 정의되지 않은 경우에만 Rails3이 autoloads를 호출 할 때 Rails3이 자동로드를 호출하는 이유를 확신하지 못합니다. – HelpMe

+0

autoload_paths와 함께 Rails를 시작할 때 한 번만로드 될 디렉토리를 정의 할 수있는 autoload_once_paths를 사용할 수 있습니다. 테스트 중에는 콘솔이나 레일 앱을 완전히 다시 시작해야합니다. 개발 중에도 초기화 프로그램과 autoload_only_once 경로는 개발 중에도 한 번만로드됩니다. –

+0

정말 혼란스러운 것은 "자동로드"가 실제로 자동으로 아무것도로드하지 않는다는 것입니다. 클래스 패스에 추가됩니다. config/initializers의 모든 것이 실제로 자동으로로드됩니다. 즉, 시작시 실행됩니다. – HelpMe

8

는 자동로드 경로는 설정/당신은 lib 디렉토리 디렉토리에서 코드를로드하려는 경우이 줄을 해제 언급 할 필요가 application.rb

#config.autoload_paths += %W(#{config.root}/extras) 

에 사용할 수 없습니다.