Rails 4 : 모델 네임 스페이스없이 하위 경로에서 레일 모델을 구성합니까?


80

이런 게 가능할까요?

app/models/
app/models/users/user.rb
app/models/users/education.rb

목표는 / app / models 폴더를 더 잘 구성하는 것이지만 모델의 네임 스페이스를 지정할 필요가 없습니다.

Rails 3에 대한 답이없는 질문은 여기에 있습니다 : Rails 3.2.9 and models in subfolders .

네임 스페이스와 함께 table_name을 지정하는 것은 작동하는 것처럼 보이지만 ( Rails 4 모델 하위 폴더 참조 ) 네임 스페이스없이이 작업을 수행하고 싶습니다 .


나는 당신이 네임 스페이스를 원하지 않는다는 것을 이해했지만 ActiveSupport Concerns를 사용하는 것이 가장 좋은 방법이라고 생각합니다.
Nando Sousa 2013

2
@NandoSousa. 아니요. ActiveSupport 문제는 ​​공유 된 행동에 대한 것입니다. 모델을 사용하는 방식.
berkes

답변:


116

기본적으로 Rails는 모델 디렉토리의 하위 폴더를 자동로드 경로에 추가하지 않습니다. 그렇기 때문에 네임 스페이스가있는 모델 만 찾을 수 있습니다. 네임 스페이스는 찾을 하위 디렉터리를 비 춥니 다.

앱 / 모델 의 모든 하위 폴더를 자동로드 경로에 추가하려면 config / application.rb에 다음을 추가합니다 .

config.autoload_paths += Dir[Rails.root.join("app", "models", "{*/}")]

또는 더 복잡한 앱 / 모델 디렉토리가있는 경우 위의 앱 / 모델 의 모든 하위 폴더를 함께 globing하는 방법이 제대로 작동하지 않을 수 있습니다. 이 경우 좀 더 명시 적으로 지정하고 지정한 하위 폴더 만 추가하면이 문제를 해결할 수 있습니다.

config.autoload_paths += Rails.root.join("app", "models", "<my_subfolder_name1>")
config.autoload_paths += Rails.root.join("app", "models", "<my_subfolder_name2>")

Rails 4.1 이상 업데이트

Rails 4.1부터 앱 생성기는 config.autoload_paths기본적으로 포함되지 않습니다 . 따라서 위의 내용은 실제로 config / application.rb에 속합니다 .

최신 정보

위 코드의 자동로드 경로 예제 {*/}{**}. 이에 대한 자세한 내용은 muichkine의 의견 을 읽으십시오 .


6
시도했지만 Unable to autoload constant User :: Credits, 예상 /srv/books/app/models/user/credits.rb와 함께 실패합니다. 따라서 여전히 파일 이름을 공백으로 지정하지 않습니다. 제안 된대로 lib 항목 위에 배치했습니다.
Rubytastic 2013-09-21

1
이 오류는 실제로 좋은 소식입니다. 파일을 찾았다는 뜻입니다. 하지만 여기서는 이상한 복수형을 사용하고 있습니다. 파일 이름이 app/models/user/credits.rb이면 파일 의 클래스 이름도 복수인지 확인하십시오 class Credits.. 그러나 Rails 표준을 사용 class Credit하고 파일 이름을 app/models/user/credit.rb(모델은 단수 여야 함)로 만드는 것이 좋습니다 . 어느 쪽이든 이것이 문제가 될 것입니다. 알려주세요!
pdobb

1
Rails 4.1 config에서 사용config.autoload_paths += %W( #{Rails.root}/app/models/namespace #{Rails.root}/app/models/other_namespace )
Epigene 2015

14
config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')]작동하지만 특히 앱이 자주 다시로드되는 개발 모드에서 애플리케이션 속도가 느려집니다. 그 이유는 autoload_paths에 모든 파일을 추가하는 것이 아니라 파일 이름과 모듈을 추론 할 수있는 루트 폴더 만 추가해야하기 때문입니다. 간단히 말해서 모델에 하위 폴더 수준이 하나만 있고 네임 스페이스 모델이없는 config.autoload_paths += Dir[Rails.root.join('app', 'models', '*/')]경우 하위 디렉터리의 첫 번째 수준 만 추가하는 작업 만 수행해야합니다 . lib또는 다른 경로에 대해 동일 합니다.
muichkine

3
@pdobb 경험입니다. :) 자동 로딩이 어떻게 작동하는지 살펴보면 auto_loading_paths모델에 대한 추론을 추가하는 루프가 모두 반복되는 것을 볼 수 있습니다 . 예를 들어 가지고 있다면 NameSpace::Model모든 autoloading_paths에서 path/namespace/model. 이것은 path디렉토리 일 때만 분명히 일치 할 수 있습니다 . 경험상 autoload_paths최대 효율을 위해 디렉토리 만 있어야 합니다. 도움이 되었기를 바랍니다.
muichkine 2015 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.