Im在Rails 3应用程序中使用gem 'acts_as_tenant'
。
我在应用程序控制器中基于域设置租户:
set_current_tenant_by_subdomain(:tenant, :subdomain)
我在工作订单模型中有代码需要使用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
为零(在Heroku上)。
为什么?
谢谢你的帮助!
更新1
相同的模型在where
stmt中使用ActsAsTenant.current_tenant
,没有问题:
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
更新2
我尝试将代码移动到应用程序控制器,但这在本地甚至不起作用:
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
更新3
我尝试了另一种方法,根据URL的子域查找租户。查找代码在视图中工作正常,但在模型中不正常。
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
我仍然不知道为什么在Heroku上ActsAsTenant.current_tenant
是nil
。
但是,以下修复了我的问题:
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