【问题标题】:Request.host in initializer Rails 4初始化器 Rails 4 中的 Request.host
【发布时间】:2015-11-30 21:46:49
【问题描述】:

我正在将 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' 放在那里时,我得到一个错误:未定义的局部变量/方法 'request'

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

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

【问题讨论】:

    标签: ruby-on-rails ruby apartment-gem


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      相关资源
      最近更新 更多