2013-02-02 17 views
5

宝石

ruby 1.9.3 
rails 3.2.11 
devise 2.2.3 
acts_as_tenant 0.2.9 

代码

我的所有型号都通过域ID作用域:多租户(acts_as_tenant)与设计(用户可以通过子域默认作用域)打破会议

class User < ActiveRecord::Base 
    acts_as_tenant(:domain) 
    #... 
end 

然后,在我application_controller,我设置从域目前的租户:

class ApplicationController < ActionController::Base 
    set_current_tenant_through_filter 
    before_filter :set_tenant 
    protect_from_forgery 
    #... 

    def set_tenant 
    #... 
    @domain = Domain.find_or_create_by_name(request.host) 
    set_current_tenant(@domain) 
    end 
end 

所有行之有效的所有车型,除了会话:每次页面加载,这将注销谁加载页面与另一个租户的第一个用户。通过加载这个页面,它会注销谁[...等等]

假设第一个用户:当Alice访问一个域名,Rails的负载current_tenant = alice_domain(OK)。所有按预期工作,直到Bob访问另一个域,加载current_tenant = bob_domain。当Alice刷新她的页面时,Rails仍然有current_tenant == bob_domain。 Rails检查会话:Alice与bob_domain作用域不存在,所以Devise强制Alice注销。然后application_controller设置current_tenant = alice_domain ...注销Bob。

肮脏的解决方法:没有在用户模式,用户范围由域名在各控制器使用acts_as_tenant自己,然后覆盖由域设计到范围登录和注册。我不确定如何让Devise知道会话中的当前域名。顺便说一句,在用户中用手动default_scope替换acts_as_tenant属于相同的奇怪错误。这样做似乎很肮脏。

我在寻找干净的解决方案。我会非常感谢任何帮助。

回答

3

固定的,application_controller,改变

before_filter :set_tenant 

prepend_before_filter :set_tenant 

为了default_scope一切,包括用户,制定检查用户的会话之前。

+0

由于某种奇怪的原因,这对我来说不适用于我/用户/编辑路线...... –

+0

在使用'set_current_tenant'之前似乎很重要的一点是不要使用'current_user'。它可能取决于你的服务器。我使用瘦身,它也适用于webrick。 – Habax