我很确定这个错误与TenantIdLoader模块的实际内容无关.相反,它与ActiveSupport个依赖项有关.

我似乎无法克服这个错误.从我所读到的,这是因为要么ActiveRecord::Base正在被重新加载,要么Company::TenantIdLoader正在被重新加载,而它不知何故没有传达这一点.救命啊!我真的很想升级到Rails 4.2.

EDIT

我现在明白了,这是因为我正在引用Tenant,它会自动重新加载.但我需要能够实际引用这个类,所以有人知道如何避开这个问题吗?

配置/应用程序.rb

config.autoload_paths += %W( #{config.root}/lib/company )

配置/初始化者/公司.rb

ActionMailer::Base.send(:include, Company::TenantIdLoader)

租户/加载器公司.rb

module Company
  module TenantIdLoader

    extend ActiveSupport::Concern

    included do
      cattr_accessor :tenant_dependency
      self.tenant_dependency = {}
  
      after_initialize do
        self.tenant_id = Tenant.active.id if self.class.tenant_dependent? and self.new_record? and Tenant.active.present? and !Tenant.active.zero?
      end
    end

    # class methods to be mixed in
    module ClassMethods
  
      # returns true if this model's table has a tenant_id
      def tenant_dependent?
        self.tenant_dependency[self.table_name] ||= self.column_names.include?('tenant_id')
      end
  
    end

  end
end

推荐答案

Tenant有点像是在转移视线——如果你引用了rails const_missing技巧需要加载的任何应用程序,就会出现错误.

问题是,您正在获取一些可重新加载的内容(您的模块),然后将其包含在一些不可重新加载的内容中(ActiveRecord::Base或,在您之前的示例ActionMailer::Base中).在某个时刻,代码被重新加载,现在ActiveRecord仍然包含这个模块,尽管rails认为它已经卸载了它.当您引用租户时会发生错误,因为这会导致rails运行其const_missing钩子,以确定租户应该从哪里加载,而代码会崩溃,因为持续搜索的起始模块不应该在那里.

有三种可能的解决方案:

  1. 停止将模块包含到不可重新加载的类中——根据需要将其包含到单个模型、控制器中,或者创建一个抽象基类并将模块包含在其中.

  2. 通过将该模块存储在非自动加载路径的地方,使其不可重新加载(您必须明确要求它,因为rails将不再神奇地为您加载它)

  3. 将租户更改为::租户(然后将调用Object.const_missing,而不是Tenant.const_missing)

Ruby-on-rails相关问答推荐

有没有一种方法可以点击一个按钮来冒泡到父元素?

Rails 7.1,登录到STDOUT和LOG/Production.log

Rails/Rspec中的测试文章创建

如何为 I18n 设置 raise_on_missing_translations

Rails 4 中的 null_session 和 reset_session 有什么区别?

Rails - 按连接表数据排序

rake assets:precompile try 连接到数据库

我如何在不同的视图中使用助手

从 Authlogic 迁移到 Devise

Heroku 错误 R14(超出内存配额):我该如何解决?

form_tag 是否与 Simple_form 一起使用?

Rails 错误:无法批量分配受保护的属性

Rails 中是否有 HTML 安全截断方法?

错误未初始化的常量 AWS (NameError)

Rails:进行不可逆转的迁移是不是很糟糕?

在范围内传递参数

rails respond_to format.js API

您将如何解析 Ruby 中的 url 以获取主域?

Rails:如何在rails中使用dependent::destroy?

Date.current 和 Date.today 有什么区别?