2012-07-18 6 views
6

मैं बहु-किरायेदारी प्रबंधित करने के लिए acts_as_tenant मणि का उपयोग कर रहा हूं, और मैं उपयोगकर्ताओं का प्रबंधन करने के लिए उपयोग कर रहा हूं।रेलों में devise और act_as_tenant के साथ उपयोगकर्ताओं की विशिष्टता 3

मेरे पास केवल किरायेदारों के लिए उपयोगकर्ता मॉडल और खाता मॉडल तैयार किया गया है। मैं एकाधिक किरायेदारों के खिलाफ उपयोगकर्ताओं को बना सकता हूं - यह सब ठीक काम कर रहा है जब मैं अलग-अलग किरायेदार आईडी के खिलाफ एक ही ईमेल के साथ दो उपयोगकर्ताओं को बनाने का प्रयास करता हूं, तो मुझे एक अचूकता त्रुटि मिलती है। मैं वर्णन के अनुसार validates_uniqueness_to_tenant विकल्प का उपयोग कर रहा हूं।

उपयोगकर्ता मॉडल

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :token_authenticatable, :confirmable, 
    # :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    attr_accessible :email, :password, :password_confirmation, :remember_me 

    acts_as_tenant(:account) 
    validates_uniqueness_to_tenant :email 
end 

खाता मॉडल

class Account < ActiveRecord::Base 
    attr_accessible :name 
end 

आवेदन नियंत्रक

class ApplicationController < ActionController::Base 
    set_current_tenant_by_subdomain(:account, :subdomain) 
    protect_from_forgery 
end 

इस तरह यह acts_as_tenant में सभी दस्तावेज़ के आधार पर काम करना चाहिए लग रहा है, मैं ओवरराइड करने की आवश्यकता है इसके बजाय devise स्तर पर कुछ?

संपादित करें: कुछ सिर-खरोंच और कुछ ब्रेक के बाद, समस्या मुझे विश्वास है क्योंकि डिफ़ॉल्ट रूप से डेविस ने ईमेल कॉलम में एक अद्वितीय अनुक्रमणिका जोड़ दी है। यह स्पष्ट रूप से क्या करता है जो act_as_tenant करना चाहता है ... मैं इंडेक्स को हटाने का प्रयास करूंगा और देख सकता हूं कि डेविस पुक्स या नहीं।

संपादित करें 2: ठीक है, आधिकारिक तौर पर इस पर छोड़ दिया गया है। मेरे पास मुख्य साइट के लिए हाथ से लुढ़का प्रमाणीकरण है और यह act_as_tenant के साथ ठीक से काम कर रहा है। मैं केवल कुछ स्तर पर act_as_tenant और Devise के बीच कुछ असंगतता मान सकता हूं - इस चरण में इसे ढूंढने के लिए।

उत्तर

8

यह करने के लिए एक ही रास्ता वसीयत से validatable मॉड्यूल को हटाने के द्वारा है और इसलिए की तरह अपने खुद के सत्यापन चलाएँ:

class User < ActiveRecord::Base 
    acts_as_tenant :account 
    attr_accessible :email, :password, :remember_me 

    #remove :validatable 
    devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable 

    #run own validations 
    #I've omitted any emailformatting checks for clarity's sake. 
    validates :email, 
    presence: true, 
    uniqueness: { scope: :account_id, case_sensitive: false } 
    validates :password, 
    presence: true, 
    length: { :in => 6..20 }, 
    :if => :password_required? 

protected 
    # copied from validatable module 
    def password_required? 
    !persisted? || !password.nil? || !password_confirmation.nil? 
    end 

end 
+3

अच्छा उत्तर - किसी और के लिए ध्यान देने योग्य मूल्य टी को ईमेल पर अद्वितीय इंडेक्स को हटाने के लिए याद है जो भी जोड़ता है। –

+0

एफवाईआई: एएटी एक स्कोप्ड सत्यापनकर्ता प्रदान करता है: 'validates_uniqueness_to_tenant: ईमेल'। इसके अलावा ईमेल प्रारूप आसानी से 'validates_format_of: ईमेल का उपयोग करके किया जा सकता है: Devise.email_regexp' – Besi

0

मैंने इसका परीक्षण नहीं किया है, लेकिन मुझे आश्चर्य है कि ऑर्डर बदलने से act_as_tenant को काम करने से पहले इसकी बात करने में मदद मिल सकती है।

class User < ActiveRecord::Base 

    acts_as_tenant(:account) 
    validates_uniqueness_to_tenant :email 

    # Include default devise modules. Others available are: 
    # :token_authenticatable, :confirmable, 
    # :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 

    attr_accessible :email, :password, :password_confirmation, :remember_me 

end 
+0

नोप क्षमा करें, काम नहीं करता है। –

+0

लगता है जैसे आप तैयार सूचकांक के साथ कुछ पर हैं। यदि यह कोई मदद है, तो मेरे सिस्टम में मैं उपयोगकर्ताओं को एक से अधिक किरायेदार से जुड़ने की अनुमति देता हूं और फिर उन्हें अपने वर्तमान किरायेदार को बदलने की क्षमता देता हूं। यह आपकी विशेष जरूरतों के लिए काम नहीं कर सकता है। – ob1

0

बस इस सवाल बारे में जाना। स्वीम का समाधान बहुत अच्छा है।

लेकिन मैं डिफ़ॉल्ट व्यवहार को ओवरराइड करना पसंद नहीं करता हूं। इसलिए मैं इस समाधान के साथ आया था:

validate :remove_old_email_validation_error 
validates_uniqueness_of :email, :allow_blank => true, :if => :email_changed?, :scope => [:account_id] 

private 

def remove_old_email_validation_error 
    errors.delete(:email) 
end 

हम ईमेल के लिए डिफ़ॉल्ट प्रमाणीकरण त्रुटि को दूर है, इसलिए सत्यापन जाँच अनदेखी, और हम अपने ही मान्यता फिर से करते हैं। जो मैंने जोड़ा है वह वैलिडेटेबल मॉड्यूल से है, लेकिन मैंने इसमें :scope जोड़ा है।

ऑर्डर रखने के लिए यह महत्वपूर्ण है। devise कमांड के बाद उपरोक्त कोड जोड़ें।

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