提问人:Prateek Vyas 提问时间:9/25/2023 更新时间:9/25/2023 访问量:58
使用 zeitwerk 的 Rails 管理员
Rails admin with zeitwerk
问:
嗨,我有一个在 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
答:
1赞
Xavier Noria
9/25/2023
#1
此错误与 Zeitwerk 无关。
在 Rails 6 中,不推荐使用从初始值设定项自动加载可重新加载的代码,并发出警告。这些警告在经典和 zeitwerk 模式下发布。这个特性已经从 Rails 7 中删除了。
升级指南中对此进行了说明。
Rails 引擎中的控制器是可重新加载的,因此适用此新规则。请按照自动加载指南中的说明将控制器装饰成一个块。to_prepare
另外,请不要调用可重新加载的代码,只需直接使用常量即可。require
RailsAdmin::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::BreakAllocation
lib
bin/rails runner 'pp Rails.autoloaders.main.dirs'
Zeitwerk::NameError
评论