使用 zeitwerk 的 Rails 管理员

Rails admin with zeitwerk

提问人:Prateek Vyas 提问时间:9/25/2023 更新时间:9/25/2023 访问量:58

问:

嗨,我有一个在 rails 6 中内置的应用程序,我正在尝试将其更新到 rails 7,但我在使用 zeitwerk 时遇到了一些问题。

在 Rails 管理启动器中

# initilizer/rails_admin.rb
require 'rails_admin/main_controller'

我有上面的代码。但它给了我NameError: uninitialized constant RailsAdmin::ApplicationController

我尝试过,但后来我得到了未初始化的常量ApplicationController,然后它继续,就像我必须要求应用程序控制器正在使用的所有内容一样require 'rails_admin/application_controller

我的 rails 管理员版本是 3.0.0 和 ruby 3

Ruby-on-Rails-7 Gemfile Ruby-3 Zeitwerk

评论

0赞 Xavier Noria 9/25/2023
这与Zeitwerk无关。在 Rails 6 中,不推荐在初始值设定项中自动加载可重新加载代码,并且在应用程序启动时发出警告。在 Rails 7 中,你不能再这样做了,但这是因为它在概念上没有意义,不依赖于 Zeitwerk。为什么要在那里加载控制器?
0赞 Prateek Vyas 9/25/2023
我需要在初始化器中做一些猴子修补。我不知道为什么他们没有在 Rails 6 中这样做。这是由于Zeitwerk,因为它在经典模式下工作正常@XavierNoria

答:

1赞 Xavier Noria 9/25/2023 #1

此错误与 Zeitwerk 无关。

在 Rails 6 中,不推荐使用从初始值设定项自动加载可重新加载的代码,并发出警告。这些警告在经典和 zeitwerk 模式下发布。这个特性已经从 Rails 7 中删除了。

升级指南中对此进行了说明。

Rails 引擎中的控制器是可重新加载的,因此适用此新规则。请按照自动加载指南中的说明将控制器装饰成一个块。to_prepare

另外,请不要调用可重新加载的代码,只需直接使用常量即可。requireRailsAdmin::MainController

评论

0赞 Prateek Vyas 9/26/2023
主控制器在 rails_admin gem 中定义
0赞 Prateek Vyas 9/26/2023
RailsAdmin::MainController 未加载到 initializer/rails_amin.rb 中
0赞 Xavier Noria 9/26/2023
是的,它是在 rails_admin gem 中定义的,这是一个引擎。该控制器可以重新加载,就像控制器一样,因为引擎会与应用程序一起重新加载。请不要用于可重新加载的代码,并按照上面链接的文档进行操作,以便能够在初始值设定项中装饰控制器。如果需要,很乐意提供更多帮助。require
0赞 Prateek Vyas 9/28/2023
我确实解决了它。谢谢!但是我在运行 NameError 时遇到类似的错误: uninitialized constant RailsAdmin::BreakAllocation 我在 initializers/rails_admin.rb 中有这一行 require Rails.root.join('lib', 'rails_admin', 'break_allocation.rb') ' 模块 RailsAdmin 模块 配置模块 Actions 类 BreakAllocation < Base 'rails zeitwerk:check
0赞 Xavier Noria 9/29/2023
这样做应该没问题。我假设文件定义了.假设该文件和该常量都不在自动加载路径中,则该文件和常量都不是由 Zeitwerk 管理的(您可以检查,如果存在,请跟进)。似乎是 Ruby 的常规 NameError(Zeitwerk 提出)。该错误在哪里引发?RailsAdmin::BreakAllocationlibbin/rails runner 'pp Rails.autoloaders.main.dirs'Zeitwerk::NameError