Rails выступает в роли арендатора, получающего ноль в модели на Heroku

Я использую gem 'acts_as_tenant' в приложении Rails 3

Я установил арендатора в контроллере приложений на основе домена:

  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).

Это почему?

Спасибо за помощь!

Update1

Та же модель использует ActsAsTenant.current_tenant в 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

Я попробовал другой подход, ища Арендатора, основываясь на поддомене 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

1 ответ

Решение

Я до сих пор не знаю почему ActsAsTenant.current_tenant является nil на Heroku.

Но следующее исправило мою проблему:

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
Другие вопросы по тегам