Class: ActionDispatch::Reloader
- Inherits:
-
Object
- Object
- ActionDispatch::Reloader
- Includes:
- ActiveSupport::Callbacks, ActiveSupport::Deprecation::Reporting
- Defined in:
- lib/action_dispatch/middleware/reloader.rb
Overview
ActionDispatch::Reloader provides prepare and cleanup callbacks, intended to assist with code reloading during development.
Prepare callbacks are run before each request, and cleanup callbacks after each request. In this respect they are analogs of ActionDispatch::Callback’s before and after callbacks. However, cleanup callbacks are not called until the request is fully complete – that is, after #close has been called on the response body. This is important for streaming responses such as the following:
self.response_body = lambda { |response, output|
# code here which refers to application models
}
Cleanup callbacks will not be called until after the response_body lambda is evaluated, ensuring that it can refer to application models and other classes before they are unloaded.
By default, ActionDispatch::Reloader is included in the middleware stack only in the development environment; specifically, when config.cache_classes
is false. Callbacks may be registered even when it is not included in the middleware stack, but are executed only when ActionDispatch::Reloader.prepare!
or ActionDispatch::Reloader.cleanup!
are called manually.
Class Method Summary collapse
-
.cleanup! ⇒ Object
Execute all cleanup callbacks.
-
.prepare! ⇒ Object
Execute all prepare callbacks.
-
.to_cleanup(*args, &block) ⇒ Object
Add a cleanup callback.
-
.to_prepare(*args, &block) ⇒ Object
Add a prepare callback.
Instance Method Summary collapse
- #call(env) ⇒ Object
-
#cleanup! ⇒ Object
:nodoc:.
-
#initialize(app, condition = nil) ⇒ Reloader
constructor
A new instance of Reloader.
-
#prepare! ⇒ Object
:nodoc:.
Constructor Details
#initialize(app, condition = nil) ⇒ Reloader
Returns a new instance of Reloader.
63 64 65 66 67 |
# File 'lib/action_dispatch/middleware/reloader.rb', line 63 def initialize(app, condition=nil) @app = app @condition = condition || lambda { true } @validated = true end |
Class Method Details
.cleanup! ⇒ Object
Execute all cleanup callbacks.
59 60 61 |
# File 'lib/action_dispatch/middleware/reloader.rb', line 59 def self.cleanup! new(nil).cleanup! end |
.prepare! ⇒ Object
Execute all prepare callbacks.
54 55 56 |
# File 'lib/action_dispatch/middleware/reloader.rb', line 54 def self.prepare! new(nil).prepare! end |
.to_cleanup(*args, &block) ⇒ Object
Add a cleanup callback. Cleanup callbacks are run after each request is complete (after #close is called on the response body).
46 47 48 49 50 51 |
# File 'lib/action_dispatch/middleware/reloader.rb', line 46 def self.to_cleanup(*args, &block) unless block_given? warn "to_cleanup without a block is deprecated. Please use a block" end set_callback(:cleanup, *args, &block) end |
.to_prepare(*args, &block) ⇒ Object
Add a prepare callback. Prepare callbacks are run before each request, prior to ActionDispatch::Callback’s before callbacks.
37 38 39 40 41 42 |
# File 'lib/action_dispatch/middleware/reloader.rb', line 37 def self.to_prepare(*args, &block) unless block_given? warn "to_prepare without a block is deprecated. Please use a block" end set_callback(:prepare, *args, &block) end |
Instance Method Details
#call(env) ⇒ Object
69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/action_dispatch/middleware/reloader.rb', line 69 def call(env) @validated = @condition.call prepare! response = @app.call(env) response[2] = ::Rack::BodyProxy.new(response[2]) { cleanup! } response rescue Exception cleanup! raise end |
#cleanup! ⇒ Object
:nodoc:
86 87 88 89 90 |
# File 'lib/action_dispatch/middleware/reloader.rb', line 86 def cleanup! #:nodoc: run_callbacks :cleanup if validated? ensure @validated = true end |
#prepare! ⇒ Object
:nodoc:
82 83 84 |
# File 'lib/action_dispatch/middleware/reloader.rb', line 82 def prepare! #:nodoc: run_callbacks :prepare if validated? end |