Class: RailsMiddlewareDelegator

Inherits:
Object
  • Object
show all
Defined in:
lib/rails_middleware_delegator.rb,
lib/rails_middleware_delegator/version.rb

Overview

RailsMiddlewareDelegator

Used to wrap a reloadable class used as Rails middleware. In development mode with ‘cache_classes=false`, after each request all autoloaded modules and classes are unloaded. If one of these classes is used as Rails middleware, then it can cause the following error:

A copy of ZZZ has been removed from the module tree but is still active

This is because Rails will hold onto an instance of the class.

Instead of using the middleware class itself, use an instance of the delegator:

Rails.application.config.
  middleware.use RailsMiddlewareDelegator.new('MyMiddlware')

Constant Summary collapse

VERSION =
'0.1.0'.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(klass) ⇒ RailsMiddlewareDelegator

Returns a new instance of RailsMiddlewareDelegator.



25
26
27
# File 'lib/rails_middleware_delegator.rb', line 25

def initialize(klass)
  @klass = klass
end

Instance Attribute Details

#initialization_argsObject (readonly)

Returns the value of attribute initialization_args.



23
24
25
# File 'lib/rails_middleware_delegator.rb', line 23

def initialization_args
  @initialization_args
end

#klassObject (readonly)

Returns the value of attribute klass.



23
24
25
# File 'lib/rails_middleware_delegator.rb', line 23

def klass
  @klass
end

Instance Method Details

#call(*args) ⇒ Object



38
39
40
# File 'lib/rails_middleware_delegator.rb', line 38

def call(*args)
  klass.constantize.new(*initialization_args).call(*args)
end

#classObject



29
30
31
# File 'lib/rails_middleware_delegator.rb', line 29

def class
  klass
end

#new(*args) ⇒ Object



33
34
35
36
# File 'lib/rails_middleware_delegator.rb', line 33

def new(*args)
  @initialization_args = args
  Rails.env.development? ? self : klass.constantize.new(*args)
end