我正在关注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
关系,但我认为这是为了防止不同租户的用户互相查看。
如何处理和修复此错误?
答案 0 :(得分:2)
好像你不需要使用
current_tenant.users
它将请求范围限定为db automatic(使用用户模型中的默认范围)。
只是
@users = Users.all