我决定对我的代码进行一些重构,因为我的一个项目开始变得非常大。因此,为了清楚起见,我决定将一些模型命名为完全独立的模块。
但是,我的控制器有一个额外的外部模块,因为我有不同的子域或所有这些模型的不同类型的控制器。
因此,我在A::MyModel
app/models/a/my_model.rb
和X::A::MyModelsController
中的控制器Y::A::MyModelsController
和app/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
有没有人对此有一些见解? 谢谢!