首页 > 解决方案 > 具有不同命名空间的模型/控制器的 Rails LoadError

问题描述

我决定对我的代码进行一些重构,因为我的一个项目开始变得非常大。因此,为了清楚起见,我决定在完全独立的模块中命名一些模型。

但是,我的控制器有一个额外的外部模块,因为所有这些模型都有不同的子域或不同类型的控制器。

因此,我有一个A::MyModel模型app/models/a/my_model.rb

和控制器X::A::MyModelsControllerY::A::MyModelsControllerapp/controllers/x/a/my_models_controller.rb和`app/controllers/y/a/my_models_controller.rb。

我碰巧只在某些端点上得到了一个异常LoadError: Unable to autoload constant MyModel, expected [...]/app/models/a/my_model.rb to define it。异常很清楚,除了它应该寻找A::MyModel.

它只发生在某些端点上,我什至设法使其适用于具有 AJAX 的端点,但不适用于 HTML。但是,它可以与 Rspecs 一起正常工作,因为我的测试都没有失败。

我怀疑这与自动加载有关,因为当它失败时,它甚至没有进入控制器:没有堆栈,Processed By xxx日志中也没有。

我正在使用 Ruby 2.4.2、Rails 5.2.0,这是我的application.rb

require_relative "boot"
require "rails"
require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_view/railtie"
require "action_cable/engine"
require "sprockets/railtie"
require "rails/test_unit/railtie"

Bundler.require(*Rails.groups)

module MonApp; end
class MonApp::Application < Rails::Application
    config.action_view.embed_authenticity_token_in_remote_forms = true
    config.generators do |generate|
        generate.assets false
    end
    config.active_job.queue_adapter = :sidekiq

    config.autoload_paths += Dir[Rails.root.join("app", "models", "**", "*")]

    config.middleware.use I18n::JS::Middleware
    config.exceptions_app = self.routes
end

令人惊讶的是,将 Ajax 与contentType: "application/json". 没有 ajax 或没有此 contentType 的相同端点似乎可以工作。

我的控制器是

class X::A::MyModelsController
    def create; end
end

有人对此有一些见解吗?谢谢!

标签: ruby-on-railsrubynamespaces

解决方案


推荐阅读