Where should I place my middleware file for Rails 5.1?
Asked Answered
S

5

20

Previously I had my middleware under lib/middleware/my_middle_ware.rb

However when doing this,

config.middleware.use MyMiddleWare

I receive a

NameError: uninitialized constant

Where is rails looking for the middleware?

Sanctity answered 21/6, 2017 at 23:56 Comment(0)
S
11

Look like rails wasn't looking for it.

I had to do the following for it to work.

Dir["./lib/middleware/*.rb"].each do |file|
  require file
end
Sanctity answered 22/6, 2017 at 14:25 Comment(3)
This is the fix I went with also, but it seems like the framework should be loading these. Maybe it is a bug?Viddah
@JayP. I agree. Is this a bug? I'm on Rails 5.2 and this is happening. Surprised there's not a standard auto-loaded directory for middleware, like there is for models, controllers, views, mailers, etc.Micromho
For the record, I dug deep into this and here's the relevant discussion with the Rails Core members about where middleware should go and how to require it: github.com/rails/rails/issues/25525#issuecomment-479941866. In short, "middleware can't be in app because they can't be reloaded. They should be in lib and if you put them in lib, require_relative will work."Micromho
G
5

Create a folder app/middlewares and create your middleware file in this folder.

But unfortunately The app/middlewares folder is not loading even if I added to the load paths in Rails v5.2.2

config.autoload_paths << "#{Rails.root}/app/middlewares"
config.eager_load_paths << "#{Rails.root}/app/middlewares"

So you can use require explicitly as follows, add this line in application.rb

require_relative '../app/middlewares/my_middleware'

and load middleware:

config.middleware.use MyMiddleware

and call rake middleware to see the middleware stack.

Graiae answered 25/9, 2019 at 12:14 Comment(0)
U
1

I believe you want to add your middleware to either your config/application.rb or your config/environments file.

config.middleware.use MyMiddleWare

This should work and append MyMiddleWare to the bottom of the middleware stack.

Unwatched answered 22/6, 2017 at 1:39 Comment(0)
A
1

Even before app/middleware contents are loaded if 'config.middleware.use' is called, I think you get the 'uninitialized Constant error'. The below should fix

config.middleware.use "MyMiddleWare"

If the above doesn't work, one of the below might be a no.

Is MyMiddleWare in app/middleware/my_middle_ware.rb ?

Is MyMiddleWare in lib/my_middle_ware.rb ?
Affected answered 22/6, 2017 at 2:32 Comment(1)
I believe specifying your middleware class using a String was valid only before Rails 5. github.com/rails/rails/issues/25525Guanase
R
0

replacing middleware as a string in config/application.rb to config/environment/{environment} as a constant fixed the issue for me

Rob answered 27/3, 2019 at 16:28 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.