How can I preload concerns in a rails initializer using Rails 6/Zeitwerk?

我与影子孤独终老i 提交于 2019-12-23 09:40:06

问题


I'm working with an initializer that does some monkey patching on app start by including some app concerns into a third party lib. Basically:

# config/initializers/my_initializer.rb

class SomeExternalLib
  include MyConcern1
  include MyConcern2
end

This works fine in Rails 5.2.3, but I got the following deprecation message when upgrading to Rails 6:

DEPRECATION WARNING: Initialization autoloaded the constants MyConcern1, and MyConcern2.

Being able to do this is deprecated. Autoloading during initialization is going to be an error condition in future versions of Rails.

Reloading does not reboot the application, and therefore code executed during initialization does not run again. So, if you reload ApplicationHelper, for example, the expected changes won't be reflected in that stale Module object.

These autoloaded constants have been unloaded.

Please, check the "Autoloading and Reloading Constants" guide for solutions. (called from at /Users/myuser/code/myapp/config/environment.rb:7)

My concerns are in app/controllers/concerns/. After some investigation, I figured out that that path wasn't being autoloaded, but I can't figure out how to make Zeitwerk—Rails 6's new autoloader—load this dynamically. I tried following the pattern for STI autoloading described here, but no luck. Any idea how to address this deprecation warning?


回答1:


Would help if I read the error message a bit more closely:

Autoloading during initialization is going to be an error condition in future versions of Rails.

Discussion for the change is here and guide is here.

In short, autoloading shouldn't be done in initializers, and this is going to be phased out. Solutions are to either 1) Don't use stuff that needs to be autoloaded in initializers (preferred, obviously), or 2) explicitly require dependencies in initializers.

So I would do:

# config/initializers/my_initializer.rb

require 'my_concern1'
require 'my_concern2'

class SomeExternalLib
  include MyConcern1
  include MyConcern2
end


来源:https://stackoverflow.com/questions/56402093/how-can-i-preload-concerns-in-a-rails-initializer-using-rails-6-zeitwerk

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!