당신이 입력하면 script/console
레일스 프로젝트를 입력 $:
, 당신은 루비를로드하는 데 필요한 모든 디렉토리를 포함하는 배열을 얻을 것이다. 이 작은 연습에서 빼놓을 수없는 것은 그것이 $:
배열이라는 것입니다. 따라서 다른 디렉토리 앞에 unshift
메서드 나 <<
연산자를 추가하는 것과 같은 기능을 수행 할 수 있습니다 . 당신은 당신의 문에 묵시적으로 $:
와 $LOAD_PATH
동일합니다.
앞서 언급했듯이 빠르고 더러운 방식으로 수행 할 때의 단점은 다음과 같습니다. 부팅 경로에 이미 디렉토리가있는 경우 자체적으로 반복됩니다.
예:
내가 만든 todo라는 플러그인이 있습니다. 내 디렉토리는 다음과 같이 구성됩니다.
/ --- 공급 업체
|
| --- / 플러그인
|
| --- / 할일
|
| --- / lib
|
| --- / 앱
|
| --- / 모델
| --- / 컨트롤러
|
| --- / 레일
|
| --- init.rb
init.rb 파일에 다음 코드를 입력했습니다.
## In vendor/plugins/todo/rails/init.rb
%w{ models controllers models }.each do |dir|
path = File.expand_path(File.join(File.dirname(__FILE__), '../lib', 'app', dir))
$LOAD_PATH << path
ActiveSupport::Dependencies.load_paths << path
ActiveSupport::Dependencies.load_once_paths.delete(path)
end
코드 블록이 'models', 'controllers', 'models'문자열에 대해 블록 내부의 작업을 수행하도록 지시하는 방법에 유의하십시오. 여기서 'models'를 반복합니다. (참고로 %w{ ... }
Ruby가 문자열 배열을 보유하도록 지시하는 또 다른 방법입니다.) 를 실행할 때 script/console
다음을 입력합니다.
>> puts $:
문자열의 내용을 더 쉽게 읽을 수 있도록 입력합니다. 내가 얻는 출력은 다음과 같습니다.
...
...
./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/models
./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/controllers
./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/models
보시다시피 이것은 제가 현재 작업중인 프로젝트를 사용하는 동안 만들 수있는 간단한 예제이지만,주의하지 않으면 빠르고 더러운 방법은 반복되는 경로로 이어질 것입니다. 더 긴 방법은 반복되는 경로를 확인하고 발생하지 않는지 확인합니다.
숙련 된 Rails 프로그래머라면 현재 수행중인 작업에 대해 매우 잘 알고있을 것이며 경로를 반복하는 실수를하지 않을 것입니다. 당신이 초보자라면 당신이하는 일을 정말로 이해할 때까지 더 긴 길을 갈 것입니다.
File.expand_path(File.dirname(__FILE__)).tap {|pwd| $LOAD_PATH.unshift(pwd) unless $LOAD_PATH.include?(pwd)}