2013-02-02 8 views
5

रत्न

ruby 1.9.3 
rails 3.2.11 
devise 2.2.3 
acts_as_tenant 0.2.9 

कोड

मेरी सभी मॉडल एक DOMAIN_ID द्वारा स्कोप कर रहे हैं: में,Multitenancy (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 

सभी सत्रों को छोड़कर सभी मॉडलों के लिए अच्छी तरह से काम करता है: प्रत्येक बार एक पृष्ठ लोड होने पर, यह पहले उपयोगकर्ता को लॉगऑ आउट करेगा जो दूसरे किरायेदार के साथ एक पृष्ठ लोड करेगा। इस पृष्ठ को लोड करके, यह लॉग-आउट होगा पहले उपयोगकर्ता के लिए जो [... आदि]

हाइपोथीसिस: जब ऐलिस एक डोमेन का दौरा, रेल भार current_tenant = alice_domain (ठीक)। जब तक बॉब किसी अन्य डोमेन पर नहीं जाता, तब तक सभी काम अपेक्षित होते हैं, current_tenant = bob_domain लोड करें। जब ऐलिस अपने पृष्ठ को रीफ्रेश करता है, तो रेल के पास अभी भी current_tenant == bob_domain है। रेल सत्र की जांच करता है: एलिस bob_domain गुंजाइश के साथ मौजूद नहीं है, इसलिए डेविस बल एलिस लॉगआउट। फिर application_controller current_tenant = alice_domain सेट करता है ... जो लॉग-आउट बॉब।

गंदे कामकाज: उपयोगकर्ता मॉडल में act_as_tenant का उपयोग न करें, प्रत्येक नियंत्रकों में डोमेन द्वारा स्वयं को डोमेन द्वारा स्कॉप करें, फिर डोमेन द्वारा लॉगिन और पंजीकरण के दायरे को ओवरराइट करें। और मुझे यकीन है कि सत्र सामग्री में वर्तमान डोमेन के बारे में डेविस को कैसे अवगत कराया जाए। वैसे, उपयोगकर्ता में मैन्युअल default_scope द्वारा act_as_tenant को प्रतिस्थापित करना एक ही अजीब बग में पड़ता है। ऐसा करने के लिए यह बहुत गंदा लगता है।

मैं दिनों के लिए एक साफ समाधान की तलाश में हूं। मैं किसी भी मदद के लिए बहुत आभारी होंगे।

उत्तर

3

फिक्स्ड, application_controller में, क्रम में उपयोगकर्ता सहित सब कुछ, default_scope में

before_filter :set_tenant 

prepend_before_filter :set_tenant 

को बदलने के लिए, इससे पहले कि वसीयत उपयोगकर्ता के सत्र की जाँच करता है।

+0

यह कुछ अजीब कारणों के लिए/उपयोगकर्ताओं/संपादन मार्ग पर मेरे लिए काम नहीं कर रहा है ... –

+0

'set_current_tenant' का उपयोग करने से पहले' current_user' का उपयोग न करना महत्वपूर्ण लगता है। यह आपके सर्वर पर निर्भर हो सकता है। मैं पतली का उपयोग कर रहा हूं, यह भीड़ के साथ काम करता है। – Habax

संबंधित मुद्दे