0

我正在将 Apartment gem 用于多租户应用程序,并且正在使用“host_hash 电梯”根据请求的子域和主机切换租户。

这是通过以下代码(来自他们的文档)完成的:

#initalizers/apartment.rb

# application.rb
module MyApplication
  class Application < Rails::Application
    config.middleware.use 'Apartment::Elevators::HostHash', {'example.com' => 'example_tenant'}
  end
end

在它显示“example.com”=>“example_tenant”的地方,我需要发送一个带有 request.host 的哈希,以在我的 Company 模型中找到 request_host 数据库字段的值与 request.host 匹配的公司。如果这有意义吗?

如果我在示例中硬编码,就像下面的代码一样,我可以让它工作,但我不知道如何根据请求动态地做到这一点:

#initalizers/apartment.rb

# application.rb
module MyApplication
  class Application < Rails::Application
    config.middleware.use 'Apartment::Elevators::HostHash', {'test.lvh.me:3000' => 'test.lvh.me:3000'}
  end
end

上面的代码有效,因为这是我当前所在的域,它与我设置的字段和公寓租户匹配。

但是,由于这是在初始化程序中放置“request.host”时出现的错误:未定义的局部变量/方法“请求”

如果我使用 'Rack::Request.new(env).host' 我会得到未定义的局部变量/方法 'env'

如何在初始化程序中获取 request.host 来解决这个问题?

4

1 回答 1

1

感谢我在公寓 gem 的 github 问题上获得的一些帮助,我能够找到解决方案。

#company.rb model
def self.full_hosts_hash
    Company.all.inject(Hash.new) do |hash, company|
      hash[company.request_host] = company.request_host
      hash
    end
end

#apartment.rb initializer
require 'apartment/elevators/host_hash'
Rails.application.config.middleware.use 'Apartment::Elevators::HostHash', Company.full_hosts_hash
于 2015-11-30T13:46:49.913 回答