多租户应用程序 - current_tenant.users的未定义方法用户

时间:2014-03-20 04:18:54

标签: ruby-on-rails ruby ruby-on-rails-4 multi-tenant railscasts

我正在关注Ryan Bate的Multitenancy with Scopes教程(http://railscasts.com/episodes/388-multitenancy-with-scopes),当我尝试将用户范围扩展到正确的租户时,我遇到了以下错误:

undefined method users for #<Tenant:0x007fc61f075228>

错误在我的users_controller.rb中引用了我的show动作:

def show
  @user = current_tenant.users
end

这是因为我删除了Tenants.rb中的关系以添加cattr_accessor :current_id

class Tenant < ActiveRecord::Base
  cattr_accessor :current_id
  #has_many :users

  def self.current_id=(id)
    Thread.current[:tenant_id] = id
  end

  def self.current_id
    Thread.current[:tenant_id]
  end
end

在我的user.rb中,我添加了default_scope:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

  default_scope { where(tenant_id: Tenant.current_id) }
end

这是我的applications_controller.rb:

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  around_filter :scope_current_tenant

  def after_sign_in_path_for(resource_or_scope)
    user_show_path(current_user.id)
  end

  private

  def current_tenant
    Tenant.find_by_subdomain! request.subdomain
  end
  helper_method :current_tenant

  def scope_current_tenant
    Tenant.current_id = current_tenant.id
    yield
  ensure
    Tenant.current_id = nil
  end
end

我不确定为何Ryan删除了has_many :users关系,但我认为这是为了防止不同租户的用户互相查看。

如何处理和修复此错误?

1 个答案:

答案 0 :(得分:2)

好像你不需要使用 current_tenant.users

它将请求范围限定为db automatic(使用用户模型中的默认范围)。

只是

@users = Users.all