具有不同命名空间的模型/控制器的Rails LoadError

时间:2018-05-03 15:05:01

标签: ruby-on-rails ruby namespaces

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

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

因此,我在A::MyModel

中有一个模型app/models/a/my_model.rb

X::A::MyModelsController中的控制器Y::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一起正常工作,因为我的测试都没有失败。

我怀疑这与Autoload有关,因为当它失败时,它甚至没有进入控制器:日志中没有堆栈,也没有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

令人惊讶的是,当使用带有contentType: "application/json"的Ajax时似乎失败了。没有ajax或没有此contentType的相同端点似乎可以工作。

我的控制器是

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

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

0 个答案:

没有答案