我正在构建一个以ActiveAdmin作为主管理界面的多租户应用。我已经使用acts_as_tenant gem来很好地分离数据。
我已将AdminUser模型用作所有用户的用户模型对象。
为了添加其他用户,AdminUser也作为租户的范围。
这会抛弃登录,因为当ActiveAdmin / Devise尝试进行身份验证时,我认为它首先点击了find_tenant过滤器,如下所示:
class ApplicationController
set_current_tenant_through_filter
before_filter :find_tenant
def find_tenant
if admin_user_signed_in?
set_current_tenant(Company.find(current_admin_user.company_id))
end
end
不确定如何解决这个问题...我希望用户登录,然后应用程序从登录用户获取company_id并设置租户,ActiveAdmin上显示的所有数据都通过该租户确定范围(此部分有效)如果我能通过登录,那么通过acts_as_tenant gem。
由于
答案 0 :(得分:0)
我认为您的怀疑是正确的,并且在身份验证之前调用了find_tenant方法,导致admin_user_signed_in?是假的。如果情况确实如此(来自http://guides.rubyonrails.org/action_controller_overview.html#after-filters-and-around-filters),那么调整它以使用后过滤器应该可以做到这一点。
class ApplicationController
set_current_tenant_through_filter
after_filter :find_tenant
def find_tenant
if admin_user_signed_in?
set_current_tenant(Company.find(current_admin_user.company_id))
end
end
不确定set_current_tenant_through_filter如何适用于所有这些,你是否试图以两种不同的方式做同样的事情?
答案 1 :(得分:0)
8岁的帖子,但是回旋路...我像这样设置routes.rb
:
devise_for :admin_users, ActiveAdmin::Devise.config
require 'sidekiq/web'
Sidekiq::Web.set :sessions, false
authenticate :admin_user do
mount Sidekiq::Web => '/admin/sidekiq'
end
在我的情况下,我的非管理员用户拥有company_id
,我认为您需要这样做:
def find_tenant
if user_signed_in?
set_current_tenant(Company.find(current_admin_user.company_id))
end
end
在AA空间中,我这样做了:
Set Multi Tenant in Active Admin Controllers (required for Searchkick index)
我仅在更新AA中的记录时设置租户。我之所以这样做是因为Searchkick索引的要求。在您的情况下,您可能只需要允许company_id参数。