2010-11-13 15 views
12

मैं वर्तमान में एक आरओआर ट्यूटोरियल (http://railstutorial.org/chapters/sign-in-sign-out#sec:signin_success प्रासंगिक अनुभाग है) के माध्यम से जा रहा हूं जो काफी अच्छा प्रतीत होता है, हालांकि नमूना साइट देखने की कोशिश करते समय मैंने निम्नलिखित समस्या में भाग लिया है ।अपरिभाषित स्थानीय चर या विधि 'current_user'

Extracted source (around line #10): 

7:   <li><%= link_to "Home", root_path %></li> 
8:   <li><%= link_to "About", about_path %></li> 
9:   
10:    <% if signed_in? %> 
11:     <li><%= link_to "Profile", current_user %></li> 
12:     <li><%= link_to "Sign out", signout_path, :method => delete %></li> 
13:    <% else %> 

जैसा कि आप देख सकते हैं, यह समस्या मेरी विधि "sign_in" से हो रही है?

module SessionsHelper 

    def sign_in(user) 
    cookies.permanent.signed[:remember_token] = [user.id, user.salt] 
    current_user = user 
    end 

    def sign_out 
    cookies.delete[:remember_token] 
    current_user = nil 
    end 

    def current_user= (user) 
    @current_user ||= user_from_remember_token 
    end 

    def signed_in? 
    !current_user.nil? 
    end 

    private 

    def user_from_remember_token 
     User.authenticate_with_salt(*remember_token) 
    end 

    def remember_token 
     cookies.signed[:remember_token] || [nil, nil] 
    end 

end 

से: जो (मैं सहायक से कोड के बाकी को शामिल किया है एक संदर्भ देने के लिए, क्षमा याचना) current_user चर सेट कर दिया जाता है कि क्या जाँच करके जांच करने के लिए माना जाता है, तो उपयोगकर्ता के हो या ना किया गया है मेरी समझ, .nil? एक ऐसी विधि है जो जांचती है कि कोई ऑब्जेक्ट परिभाषित किया गया है या नहीं, इसलिए अपरिभाषित वस्तु को त्रुटि उत्पन्न नहीं करनी चाहिए बल्कि झूठी वापसी करनी चाहिए? मैंने current_user के सभी मामलों के लिए ट्यूटोरियल की खोज की (यह देखने से पहले कि किसी और को कम सफलता के साथ यह समस्या है या नहीं) और मेरा कोड सही लगता है, इसलिए मैं थोड़ा उलझन में हूं और यदि कोई मुझे रूबी चर के तरीके को समझने में मदद करने में सक्षम है माना जाना चाहिए और मेरा कोड क्यों काम नहीं कर रहा है मैं सबसे आभारी हूं।

संपादित करें:

अगर यह गुंजाइश के साथ महत्वपूर्ण है के रूप में मैं सिर्फ दोनों रेल और रूबी शुरुआत कर रहा हूँ मैं सुनिश्चित नहीं हूं, फिर भी सहायक SessionsHelper मेरे उपयोगकर्ता नियंत्रक और विचारों के द्वारा प्रयोग किया जा रहा है (यह मेरी अनुप्रयोग में शामिल है नियंत्रक)

उत्तर

7

मैं इसी समस्या में भाग गया & यह इसी कारण से था। आपने 'लिस्टिंग 9.16' पर दिए गए निर्देशों का हिस्सा अनदेखा किया है।

def current_user= (user) 
    @current_user ||= user_from_remember_token 
end 

आपको इसे निम्न में बदलना था।

def current_user 
    @current_user ||= user_from_remember_token 
end 

तुम भी की * स्व। * Current_user को * @ * current_user उदाहरणों के सभी बदलने के लिए चाहता हूँ।

एक बार ऐसा करने के बाद त्रुटि हल हो जाती है।

2

शून्य? विधि यह जांचने के लिए नहीं जा रही है कि कोई चर या विधि परिभाषित की गई है या नहीं। यह पूरी तरह से जांच कर रहा है कि इसे शून्य वस्तु के रूप में परिभाषित किया गया है या नहीं। रूबी सत्र हेल्पर के लिए पूर्वजों की श्रृंखला को चलाता है और आखिरकार निर्धारित करता है कि current_user कहीं भी परिभाषित नहीं है (अंत में यह कर्नेल # method_missing पर समाप्त हो जाएगा) और फिर एक त्रुटि फेंकता है। समस्या को हल करने का सबसे तेज़ तरीका होगा:

#app/helpers/sessions_helper.rb 
def current_user 
    @current_user ||= false 
end 
+0

या मुझे विश्वास है कि आप "@current_user || = user_from_remember_token || false" कर सकते हैं यदि आप अपने वर्तमान कोड के साथ और अधिक होना चाहते हैं। – JackCA

+0

जबकि यह निश्चित रूप से त्रुटि को रोकता है, यह लगातार झूठी लौट रहा है। मुझे लगता है कि यह संभव है कि मेरे साइन-इन तरीकों के साथ कोई समस्या हो सकती है जो एक current_user को कभी परिभाषित नहीं किया जा सकता है, इसलिए शायद अच्छी नींद के बाद इसे देखने के लिए मेरे लिए सबसे अच्छा हो। – djlumley

2

मैंने एक दोस्त से पूछा, और उसने मेरी त्रुटियों को सही किया। मुझे लगता है कि मेरी गलती का एक बड़ा हिस्सा रूबी में परिवर्तनीय दायरे से पूरी तरह परिचित नहीं था और यह भूल रहा था कि सब कुछ एक वस्तु है और इसलिए विधि current_user = (उपयोगकर्ता) असाइनमेंट फ़ंक्शन को ओवरराइड कर रहा था।

मेरे मित्र का समाधान मौजूदा_सुरर के दायरे को एक इंस्टेंट वैरिएबल में बदलना था (इसलिए इसे ठीक से इस्तेमाल किया जा सकता है), और यह निर्धारित करने के लिए कि वर्तमान उपयोगकर्ता मौजूद है या नहीं, यह एक सरल get_current_user फ़ंक्शन में फ़ंक्शन curent_user = (उपयोगकर्ता) को बदलें। कुकी में

#app/helpers/sessions_helper.rb 

    def sign_in(user) 
    cookies.permanent.signed[:remember_token] = [user.id, user.salt] 
    @current_user = user 
    end 

    def sign_out 
    cookies.delete(:remember_token) 
    @current_user = nil 
    end 

    def get_current_user 
    @current_user ||= user_from_remember_token 
    end 

    def signed_in? 
    !get_current_user.nil? 
    end 

#app/views/layouts/_header.erb 
<% if signed_in? %> 
       <li><%= link_to "Profile", get_current_user %></li> 
       <li><%= link_to "Sign out", signout_path, :method => :delete %></li> 
      <% else %> 
       <li><%= link_to "Sign in", signin_path %></li> 
      <% end %> 

तुम मेरे हैडर आंशिक में चर देख सकते हैं भी उपयोगकर्ता प्राप्त करने के लिए सहायक में प्रयोग किया जाता विधि प्रतिबिंबित करने के लिए बदल दिया गया है:

अंतिम बदली हुई कोड इस प्रकार है।

पढ़ने कुछ बुनियादी रूबी शुरू करने के लिए जा रहे हैं गाइड ताकि अगली बार मैं अपने सिर के ऊपर में मिलता है मैं कहाँ फिक्सिंग यह :)

+1

रेल प्राधिकरण के लिए सबसे अच्छा अभ्यास get_current_user के बजाय विधि current_user का नाम और एक विधि current_user को परिभाषित करना होगा? यह जांचता है कि current_user शून्य है या नहीं। यह एक बहुत ही आम पैटर्न है। –

+0

क्या इसके लिए कोई विशेष कारण है? या यह है, जैसे अधिकांश रेल चीजें लगती हैं, सिर्फ इसलिए कि लोग ऐसा करते हैं? मैं पठनीयता की वृद्धि देख सकता हूं, बस सोच रहा हूं कि क्या कोई और कारण है जिसे मैं याद कर रहा हूं। – djlumley

+0

यह सिर्फ एक रेल चीज नहीं है। गेटर्स और सेटर्स के लिए रूबी सम्मेलन attribute_name() और attribute_name =() है। जोड़ने की क्षमता? विधि नामों के लिए जानबूझकर था ताकि डेवलपर्स सुसंगत प्रश्न बना सकें। रुबी को यथासंभव बातचीत के रूप में डिजाइन किया गया है। –

4

सुनिश्चित करें कि आप SessionHelper

में निम्न कोड किया है शुरू करने के लिए की एक विचार है
def current_user=(user) 
    @current_user = user 
end 

def current_user 
    @current_user ||= user_from_remember_token 
end 
संबंधित मुद्दे