Rails에서 require, require_dependency 및 상수를 다시로드하는 방법은 무엇입니까?
어떻게 require
그리고 require_dependency
다른가요? 개발중인 클래스를 자동으로 다시로드
할 수있는 방법은 무엇입니까?require_dependency
require
Rails ActiveSupport::Dependencies
와 dispatcher.rb 코드를 파헤 쳤습니다 . require_dependency
의 코드 에서 본 것은 기본적으로 autoloaded_constants
배열에 상수를 추가한다는 것 입니다. 그러나 clear_application
각 요청 후 내부 디스패처 에서 지워집니다 .
누군가가 명확한 설명을하거나 도움이 될 자료를 알려줄 수 있습니까?
require
(및 그 사촌 load
)은 핵심 Ruby 메서드입니다. require_dependency
Rails가 종속성 관리 문제를 처리하는 데 도움이되는 방법입니다. 간단히 말해서 Rails는 개발 모드에서 클래스를 다시로드 할 수 있으므로 코드를 변경할 때마다 서버를 다시 시작할 필요가 없습니다. Rails 프레임 워크는 require_dependency
코드가 변경되면이를 추적하고 다시로드 할 수 있도록합니다. 표준 Ruby require
는 그렇게하지 않습니다. 앱 (또는 플러그인 / 엔진) 개발자 require_dependency
는 순전히 Rails 내부 에 있기 때문에 걱정할 필요가 없습니다 .
Rails 클래스 로딩 프로세스의 마법은 ActiveSupport :: Dependencies 모듈에 있습니다. 이 코드는 기본 Ruby 동작을 확장하여 Rails 앱 내의 코드가 Rails의 경로 및 파일 이름 지정 규칙을 사용하여 모듈 (모듈에서 상속하는 클래스 포함)을 자동으로로드 할 수 있도록합니다. 이렇게하면 프로그래머가 require
일반 Ruby 애플리케이션 에서처럼 호출로 코드를 흩 뜨릴 필요가 없습니다 .
다시 말해 class Admin::User
, 파일 내부 를 정의 하고 컨트롤러와 같은 애플리케이션의 다른 부분에서 app/models/admin/user.rb
호출 할 때 사용자가 말하는 내용을 Rails가 알 수 있도록합니다 Admin::User.new
. ActiveSupport :: Dependencies가 없다면 require
필요한 모든 것을 수동으로 해야합니다.
C #, Java 등과 같은 정적으로 형식화 된 언어를 사용하는 경우 놀라운 일이 될 수 있습니다. Rails 코드는 필요할 때까지로드되지 않습니다. 예를 들어, User
모델 클래스는 정의 user.rb
되지 않았으며을 호출하려고 할 때까지로드되지 않습니다 User.whatever_method_here
. Rails는 Ruby가 누락 된 상수에 대해 불평하는 것을 방지하고에 대한 코드를로드 User
한 다음 Ruby가 정상적으로 계속되도록합니다.
특정 요구 사항에 대해 말할 수는 없지만 실제로 require_dependency
플러그인이나 엔진 내 에서 메서드 를 사용해야한다면 매우 놀랍습니다 . Rails 규칙을 따르는 경우 $ LOAD_PATH를 직접 조정할 필요도 없습니다. 이것은 "레일즈 방식"이 아닙니다.
Ruby와 Rails의 세계에서는 단순성과 명확성이 핵심입니다. 플러그인이나 엔진을 작성하고 이미 내부에 깊이 빠져들고 있다면 다른 각도에서 문제에 접근하는 것을 고려할 수 있습니다. 내 직감은 당신이 불필요하게 복잡한 일을하려고 할지도 모른다고 말해줍니다. 그러나 다시, 나는 당신이 정확히 무엇을하고 있는지 전혀 모른다 !! :)
require_dependency
엔진에 정의되지 않은 클래스 (예 : 다른 엔진 또는 Rails 앱)를 다시 열고 다시로드하려는 경우 엔진에서 유용합니다. 이 경우 다음과 같이 작동합니다.
# app/controllers/my_engine/documents_controller.rb
require_dependency MyEngine::Engine.root.join('app', 'controllers', 'my_engine', 'documents_controller').to_s
module MyEngine
class DocumentsController
def show
render :text => 'different'
end
end
end
'program story' 카테고리의 다른 글
다른 파일에서 클래스 가져 오기 (0) | 2020.11.20 |
---|---|
PHP (> = 5.0)에서 참조로 전달하는 것이 더 빠릅니까? (0) | 2020.11.20 |
PHP에서 간단한 크롤러를 어떻게 만듭니 까? (0) | 2020.11.20 |
Java 클래스를 프로그래밍 방식으로 컴파일하고 인스턴스화하는 방법은 무엇입니까? (0) | 2020.11.20 |
튜플이 Python의 목록보다 빠른 이유는 무엇입니까? (0) | 2020.11.20 |