Rails在Heroku的模型中扮演租户的角色

时间:2014-09-17 18:45:06

标签: ruby-on-rails heroku acts-as-tenant

我在Rails 3应用程序中使用gem 'acts_as_tenant'

我根据域设置了应用程序控制器中的租户:

  set_current_tenant_by_subdomain(:tenant, :subdomain)

我在workorder模型中有代码需要使用current_tenant:

class Workorder < ActiveRecord::Base
acts_as_tenant(:tenant)

if ActsAsTenant.current_tenant.data.present?
  ActsAsTenant.current_tenant.data.each do |key, value|
    ransacker key do |parent|
      Arel::Nodes::InfixOperation.new('->', parent.table[:data], key)
    end
  end
end

在我的本地Mac上,这很好用。但是,当我上传到Heroku时,我收到了这个错误:

Sep 17 11:25:38 ndeavor-staging app/web.1:  /app/app/models/workorder.rb:8:in `<class:Workorder>': undefined method `data' for nil:NilClass (NoMethodError) 

所以,ActsAsTenant.current_tenant是nil(在Heroku上)。

为什么?

感谢您的帮助!

UPDATE1

同一模型在ActsAsTenant.current_tenant stmt中使用where没有问题:

  if ActsAsTenant.current_tenant.data != nil
    ActsAsTenant.current_tenant.data.each do |key, value|
      ransacker key do |parent|
        Arel::Nodes::InfixOperation.new('->', parent.table[:data], key)
      end
    end
  end

  def self.woclosed
    where("wostatus_id = ?", ActsAsTenant.current_tenant.workorder_closed).where(:archive => false)
  end

UPDATE2

我尝试将代码移动到应用程序控制器,但这甚至不能在本地运行:

class ApplicationController < ActionController::Base

set_current_tenant_by_subdomain(:tenant, :subdomain)

if current_tenant.data.present?
  current_tenant.data.each do |key, value|
    ransacker key do |parent|
      Arel::Nodes::InfixOperation.new('->', parent.table[:data], key)
    end
  end
end

但我明白了:

 NameError: undefined local variable or method `current_tenant' for ApplicationController:Class

UPDATE3

我尝试了另一种方法,根据网址的子域名查找租户。查找代码在视图中正常工作,但它不在模型中。

ct = Tenant.where(subdomain: request.subdomain).first
  if ct.data.present?
    ct.data.each do |key, value|
      ransacker key do |parent|
        Arel::Nodes::InfixOperation.new('->', parent.table[:data], key)
      end
    end
 end

1 个答案:

答案 0 :(得分:4)

我仍然不知道Heroku上ActsAsTenant.current_tenantnil的原因。

但是,以下问题解决了我的问题:

class Workorder < ActiveRecord::Base
  acts_as_tenant(:tenant)

  ct = Tenant.find(self.first.tenant)
  if ct.data.present?
    ct.data.each do |key, value|
      ransacker key do |parent|
        Arel::Nodes::InfixOperation.new('->', parent.table[:data], key)
      end
    end
  end