【发布时间】:2022-12-15 07:41:44
【问题描述】:
I have a Rails initializer (features.rb) that must access a model (Report).
Report.all.each do |report|
default_to_enabled(report&.feature_name)
end
使用 Zeitwerk 和 6.1 的默认设置,这一切都与 Rails 6.1 完美配合:
config.load_defaults 6.1
config.autoloader = :zeitwerk
但是升级到 Rails 7,将默认值保持在 6.1(并且显然使用 Zeitwerk),它不起作用:
/Users/brandon/Code/Rails/portal/config/initializers/features.rb:105:in `<main>': uninitialized constant Report (NameError)
如果我手动requireReport模型,它并不能解决问题。相反,我只是得到
/Users/brandon/Code/Rails/portal/app/models/report.rb:1:in `<main>': uninitialized constant ApplicationRecord (NameError)
Did you mean? ApplicationConfig
因此,在 Rails 启动过程的这一点上,似乎还有很多东西尚未加载,但在 Rails 6.1 上运行时,这些东西会在此时加载。
添加 require 'rails/all' 不会改变任何内容。
(如果不是很明显,这适用于全部我的模型,还有很多其他的东西。我以前在初始化期间可用的所有类现在在 Rails 7 上都不可用。)
我怎样才能解决这个问题并使一切都在 Rails 7 上运行?
【问题讨论】:
-
如果它增加了你的洞察力......我有两个 Rails 7 应用程序,我只是在每个应用程序中添加了一个测试初始化程序以确定在运行初始化程序时是否加载了 app/models 中的模型......在两个应用程序中模型是不是加载。您可能需要在 application.rb (guides.rubyonrails.org/configuring.html#using-initializer-files) 中配置一个
config.after_initialize块并在那里运行您的 init。 -
是的,谢谢,我刚刚发现这是一个解决方案,当我发现您的评论时正要将其发布在这里。我不知道这是唯一还是最好的解决方案,但它对我有用。
-
当然,如果其他人提出更好的答案,我会接受他们的答案而不是我自己的。
标签: ruby-on-rails ruby ruby-on-rails-6 ruby-on-rails-7 ruby-on-rails-6.1