2012-12-12 11 views
28

उपयोगकर्ता सत्र/पंजीकरण प्रबंधित करने के लिए डेविस का उपयोग करके मुझे विशिष्ट कार्यों को निष्पादित करने की आवश्यकता होगी (उदाहरण के लिए इस विशिष्ट उपयोगकर्ता के लिए उपयोगकर्ता तालिका में कुछ फ़ील्ड अपडेट करना) प्रत्येक बार जब कोई उपयोगकर्ता साइन इन करता है, और इससे पहले कि वह होम पेज पर रीडायरेक्ट हो जाए जुड़े उपयोगकर्ताओं के लिए।रेल - जब उपयोगकर्ता साइन इन करते हैं तो विशिष्ट कार्य करने के लिए तैयार सत्र नियंत्रक को ओवरराइड कैसे करें?

क्या आपको सत्र सत्र नियंत्रक को ओवरराइड करना है, और यदि हां कैसे?

उत्तर

50

वैकल्पिक रूप से, आप अपने खुद के सत्र नियंत्रक

class SessionsController < Devise::SessionsController 
    def new 
    super 
    end 

    def create 
    self.resource = warden.authenticate!(auth_options) 
    set_flash_message(:notice, :signed_in) if is_navigational_format? 
    sign_in(resource_name, resource) 
    if !session[:return_to].blank? 
     redirect_to session[:return_to] 
     session[:return_to] = nil 
    else 
     respond_with resource, :location => after_sign_in_path_for(resource) 
    end 
    end 
end 

बना सकते हैं और routes.rb ऐड में:

devise_for :users, controllers: {sessions: "sessions"} 
+0

धन्यवाद! मैं पहले समाधान का उपयोग कर समाप्त हुआ, लेकिन इसे अन्य समान उपयोग मामलों के लिए ध्यान में रखेगा –

+2

कोड सीम थोड़ा बदल गया है, मास्टर कॉपी से लिंक करें: https://github.com/plataformatec/devise/blob/master/ ऐप/नियंत्रक/devise/session_controller.rb – Daniel

15

डेविस after_database_authentication कॉलबैक विधि प्रदान करता है। आपके पास वर्तमान प्रमाणीकृत उपयोगकर्ता ऑब्जेक्ट के लिए पूर्ण पहुंच है।

यदि आप प्रत्येक सफल लॉगिन के बाद वर्तमान उपयोगकर्ता नाम अपडेट करना चाहते हैं तो आप नीचे ऐसा कर सकते हैं।

class User < ActiveRecord::Base 
    devise :database_authenticatable 

    def after_database_authentication 
    self.update_attributes(:name => "your name goes here") 
    end 
end 
+0

बहुत बहुत धन्यवाद, यही वह है जिसे मैं ढूंढ रहा था! –

+0

उस उदाहरण की प्रतिलिपि बनाएं और पेस्ट न करें क्योंकि साउंडर ने एक दूसरा "डीफ़" लिखा था जहां उसे "अंत" लिखा जाना चाहिए था – heavysixer

+0

@heavysixer टाइपो को इंगित करने के लिए धन्यवाद। मैंने जवाब अपडेट किया। –

9

आप sessions_controller#create की Devise's implementation को देखें, तो आप देखेंगे कि वे उपज यदि आप एक ब्लॉक पास करते हैं।

तो, बस अपने सत्र नियंत्रकों को उपclass और जब आप सुपर कॉल करते हैं तो ब्लॉक पास करें। ऐसा करने के लिए, पहली routes.rb में वसीयत बताते हैं कि आप अपने खुद के सत्र नियंत्रक का उपयोग करना चाहते हैं:

devise_for :users, controllers: { sessions: 'users/sessions' } 

और फिर एक SessionsController वर्ग बना सकते हैं और जब आप अपने बनाने के विधि में सुपर फोन एक ब्लॉक गुजरती हैं। यह कुछ इस तरह दिखेगा:

class Users::SessionsController < Devise::SessionsController 
    layout "application" 

    # POST /login 
    def create 
    super do |user| 
     if user.persisted? 
     user.update_attributes(foo: :bar) 
     end 
    end 
    end 
end 

वसीयत नियंत्रक तरीकों में से अधिकांश एक ब्लॉक स्वीकार करते हैं, तो आप पंजीकरण के लिए ऐसा कर सकता है, साथ ही पासवर्ड, आदि भूल गया।

+0

'त्रुटि: पासवर्ड खाली नहीं हो सकता है '। ऐसा लगता है कि आप पासवर्ड की आपूर्ति किए बिना किसी भी डिवाइस-संरक्षित संसाधन (उदा। उदाहरण में 'foo') के गुण अपडेट नहीं कर सकते हैं? – changingrainbows

+0

यदि आप user.persisted करते हैं तो आप 'user.update_attributes (foo:: bar) पर लाइन को बदलने का प्रयास कर सकते हैं? इसलिए यदि डिवाइस सहेजने में तर्क विफल हो जाता है तो यह नहीं चलता है। –

+0

स्पष्ट रूप से मेरे उत्तर को अपडेट किया और स्पष्टता के लिए 'user.persisted? 'जोड़ा। –

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