2012-07-18 1 views
9

모든 파일이 폴더 구조 (Java 패키지와 유사)의 모듈에 있어야한다는 것은 루비 규칙입니까? 예를 들어모든 루비 파일은 폴더 구조와 일치하는 모듈 구조를 가지고 있어야합니까?

, 나는 보이는 파일 구조가있는 경우 같은

lib 디렉토리/인/유틸

여기에있는 파일은 다음과 같은 모듈 구조를 가질 것이다 :

module People 
    module Utils 
    # some functionality for People::Utils 
    end 
end  

이유 제가 레일 코드를 읽었 기 때문에 묻습니다. 그리고 파일 구조에 여러 파일이있는 것처럼 보이지만 모듈 선언이 없습니다.

People::Utils을 포함하지 않고도 유틸리티 기능을 사용할 수 있다고 생각합니다.

모듈을 사용해야 할 때와 사용하지 말아야 할 규칙에 대해 루비에서 규칙이 있습니까?

답변

4

일반적으로 클래스와 파일을 비슷한 구조에 넣는 것이 좋습니다. 사람들이 클래스 이름을 해당 정의로 쉽게 매핑 할 수있게 해주기 때문입니다.

하지만 이렇게하지 않는 것이 좋습니다. 궁극적으로 원하는대로 코드를 구조화 할 수 있습니다. 나는 같은 것을 다 다루는 많은 소규모 수업이있을 때가끔 그것을했습니다. 나는 그것들을 조합했습니다.

그리고 모듈이나 클래스를 정의하지 않는 파일을 갖는 것이 좋습니다. 구성 파일 또는 2 진 파일, 또는 부트 스트랩 파일 (다른 모든 파일을로드하는 파일).

12

레일스의 표준입니다. Rails가 모델을로드하는 방법은 폴더 구조를보고 클래스가 어디에 있는지 추측하는 것입니다. 우리는 이른바 autoload_paths을 가지고 있습니다.

당신은에서 호출하여 찾을 수 있습니다 rails console (이것은 그들에게 보여 할 수있는 쉬운 방법이있을 수 있습니다, 조금 해키) : 당신의 config/application.rb 설정에 config.autoload_paths += %W(#{config.root}/lib)없이,

app.instance_variable_get(:"@app").instance_variable_get(:"@_all_autoload_paths") 

기본 레일 응용 프로그램 출력 블록은 다음과 같이 보일 것이다 : 당신이 app/models/something/util.rb을 가지고 당신이 이러한 경로로 살펴 보겠습니다 어딘가 Something::Util를 호출하는 경우

["/Users/lunks/Code/rsvp/app/assets", 
"/Users/lunks/Code/rsvp/app/controllers", 
"/Users/lunks/Code/rsvp/app/helpers", 
"/Users/lunks/Code/rsvp/app/mailers", 
"/Users/lunks/Code/rsvp/app/models"] 

그래서, 01로 app/models/ 폴더를 찾을그리고 이것을 로딩하십시오.

루비는 그것에 대해 신경 쓰지 않습니다. 일반 Ruby에서 자동로드는 this page에 설명 된대로 작동합니다. Autoload를 사용하거나 직접 파일을 요구해야합니다 (폴더 구조가 아무 의미가 없습니다).

+0

그리고 레일즈 버전에서 autoload_paths를 나열하려면 : Rails.application.instance_variable_get (: "@_ all_autoload_paths")' – valk