Ruby on rails NoMethodError:未定义的方法'eager_load_path';对于#<;I18n::配置:0x00007fceade8c0f0>;
在运行ruby 2.7的rails 6应用程序中,我尝试使用Zeitwerk加载所有文件。以下是my application.rb文件的一个片段:Ruby on rails NoMethodError:未定义的方法'eager_load_path';对于#<;I18n::配置:0x00007fceade8c0f0>;,ruby-on-rails,eager-loading,ruby-on-rails-6,zeitwerk,Ruby On Rails,Eager Loading,Ruby On Rails 6,Zeitwerk,在运行ruby 2.7的rails 6应用程序中,我尝试使用Zeitwerk加载所有文件。以下是my application.rb文件的一个片段: class Application < Rails::Application config.load_defaults "6.0" Zeitwerk::Loader.eager_load_all # Application configuration can go into files in config/initializers # --
class Application < Rails::Application
config.load_defaults "6.0"
Zeitwerk::Loader.eager_load_all
# Application configuration can go into files in config/initializers
# -- all .rb files in that directory are automatically loaded after loading
# the framework and any gems in your application.
# Middlewares
config.middleware.insert 0, Rack::UTF8Sanitizer
config.middleware.use Rack::Attack
config.autoload_paths += Dir["#{config.root}/lib/**/*"]
config.autoload_paths += Dir["#{config.root}/app/models/**/*"]
config.autoload_paths += Dir["#{config.root}/app/observers/*"]
config.autoload_paths += Dir["#{config.root}/app/middleware/*"]
config.autoload_paths += Dir["#{config.root}/app/validators/**/*"]
config.autoload_paths += Dir["#{config.root}/app/**/concerns/*"]
config.autoload_paths += Dir["#{config.root}/app/operations/**/*"]
config.autoload_paths += Dir["#{config.root}/app/scrubbers/**/*"]
config.autoload_paths += Dir["#{config.root}/app/workers/**/*"]
config.paths.add "#{config.root}/app/operations/", eager_load: true
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
config.time_zone = "UTC"
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')].reject { |f| File.fnmatch("#{Rails.root.to_s}/config/locales/**/x_*.yml", f) }
config.i18n.available_locales = [:"en", :"fr", :"fr_en"]
config.i18n.default_locale = :en
# Precompile additional assets.
# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
config.assets.precompile += ["public.css", "public.js", "public_payments.js", "email.css", "pdf.css", "pronotif.css"]
config.middleware.insert_before 0, Rack::Cors do
allow do
origins '*'
resource '*', :headers => :any, :methods => [:get, :post, :options]
end
end
类应用程序:any,:methods=>[:get,:post,:options]
结束
结束
结束
但是,当我运行此命令时,会出现以下错误:
NoMethodError: undefined method `eager_load_paths' for #<I18n::Config:0x00007fceade8c0f0>
NoMethodError:#
对此问题的任何解决方案都会有帮助
除了application.rb状态不好(如中提到的@max)这一事实之外,Rails也存在问题
不幸的是(在撰写本文时,Rails 6.0.2.2的修复程序目前还不是公开的
临时解决办法
但是在此之前您可以将文件复制到名为lib/tasks/local_zeitwerk.rake的应用程序中
,并将第41行更改为:
namespace:local_zeitwerk do
然后使用执行检查任务
bin/rails local_zeitwerk:check
问题
除了application.rb状态不好(如中提到的@max)这一事实之外,Rails也存在问题
不幸的是(在撰写本文时,Rails 6.0.2.2的修复程序目前还不是公开的
临时解决办法
但是在此之前您可以将文件复制到名为lib/tasks/local_zeitwerk.rake的应用程序中
,并将第41行更改为:
namespace:local_zeitwerk do
然后使用执行检查任务
bin/rails local_zeitwerk:check
别着急。没有理由将所有这些目录添加到自动加载路径。默认情况下,Rails已经将
/app
的每个子目录添加到自动加载路径中。添加Dir[“#{config.root}/lib/***”]
也是一种蚂蚁模式,因为它会将lib
的每个子目录都添加为根。我也不明白为什么你认为你想自动加载application.rb中的所有内容,因为这只会破坏dev/test中的代码重新加载。这闻起来很像一个X&Y问题——你想用这一切解决的实际问题是什么?别着急。没有理由将所有这些目录添加到自动加载路径。默认情况下,Rails已经将/app
的每个子目录添加到自动加载路径中。添加Dir[“#{config.root}/lib/***”]
也是一种蚂蚁模式,因为它会将lib
的每个子目录都添加为根。我也不明白为什么你认为你想自动加载application.rb中的所有内容,因为这只会破坏dev/test中的代码重新加载。这闻起来很像一个X&Y问题——你用这一切试图解决的实际问题是什么?