2013-04-08 7 views
5

डेविस एक ऐसी समस्या फेंक रहा है जिसे मैं समझ नहीं पा रहा हूं।बेनामी डेविस समस्या: "[17] प्रतीक नहीं है"

बेहतर त्रुटियों का उपयोग करना; यहाँ है जहाँ यह पकड़ा जाता है:

constantize (मणि) में ब्लॉक activesupport-3.2.12/lib/active_support/Inflector/methods.rb

225   names = camel_cased_word.split('::') 
    226   names.shift if names.empty? || names.first.empty? 
    227 
    228   constant = Object 
    229   names.each do |name| 
    230   constant = constant.const_defined?(name, false) ? 
        constant.const_get(name) : constant.const_missing(name) 
    231   end 
    232   constant 
    233  end 
    234  end 

अधिक जानकारी:

Request info: 
Request parameters {"controller"=>"devise/sessions", "action"=>"new"} 
Rack session  {"session_id"=>"a2bcc708204fb5dce015439f6881f67d","_csrf_token"=>"TzIKUgPy8y4F6kFfkDG/xfgCm4vMqkgReLHbK+cjeFI=", "warden.user.user.key"=>[[17], "$2a$10$/WvxkLxIdgHOMxg8nus6cu"]} 


Local Variables: 
name  [17] 
camel_cased_word [17] 
names [[17]] 
constant Object 

कोई भी विचार ? और जानकारी क्या उपयोगी होगी?

यहाँ का पता लगाने के अंत बंद एक हिस्सा है:

block in ActiveSupport::Inflector.constantize 
(gem) activesupport-3.2.12/lib/active_support/inflector/methods.rb, line 230 
ActiveSupport::Inflector.constantize 
(gem) activesupport-3.2.12/lib/active_support/inflector/methods.rb, line 229 
Warden::SessionSerializer#deserialize 
(gem) devise-2.2.3/lib/devise/rails/warden_compat.rb, line 27 
Warden::SessionSerializer#fetch 
(gem) warden-1.2.1/lib/warden/session_serializer.rb, line 35 
Warden::Proxy#user 
(gem) warden-1.2.1/lib/warden/proxy.rb, line 212 
Warden::Proxy#_perform_authentication 
(gem) warden-1.2.1/lib/warden/proxy.rb, line 318 
Warden::Proxy#authenticate 
(gem) warden-1.2.1/lib/warden/proxy.rb, line 104 
Warden::Proxy#authenticate? 
(gem) warden-1.2.1/lib/warden/proxy.rb, line 114 
Devise::SessionsController#require_no_authentication 
(gem) devise-2.2.3/app/controllers/devise_controller.rb, line 124 
Devise::SessionsController# 
_run__642094268016367352__process_action__582726832569976772__callbacks 
(gem) activesupport-3.2.12/lib/active_support/callbacks.rb, line 418 
Devise::SessionsController.__run_callback 
(gem) activesupport-3.2.12/lib/active_support/callbacks.rb, line 405 
Devise::SessionsController#_run_process_action_callbacks 
(gem) activesupport-3.2.12/lib/active_support/callbacks.rb, line 385 
Devise::SessionsController#run_callbacks 
(gem) activesupport-3.2.12/lib/active_support/callbacks.rb, line 81 
Devise::SessionsController#process_action 
(gem) actionpack-3.2.12/lib/abstract_controller/callbacks.rb, line 17 
Devise::SessionsController#process_action 
(gem) actionpack-3.2.12/lib/action_controller/metal/rescue.rb, line 29 
block in Devise::SessionsController#process_action 
(gem) actionpack-3.2.12/lib/action_controller/metal/instrumentation.rb, line 30 
block in ActiveSupport::Notifications.instrument 
(gem) activesupport-3.2.12/lib/active_support/notifications.rb, line 123 
ActiveSupport::Notifications::Instrumenter#instrument 
(gem) activesupport-3.2.12/lib/active_support/notifications/instrumenter.rb, line 20 
ActiveSupport::Notifications.instrument 
(gem) activesupport-3.2.12/lib/active_support/notifications.rb, line 123 
Devise::SessionsController#process_action 
(gem) actionpack-3.2.12/lib/action_controller/metal/instrumentation.rb, line 29 
Devise::SessionsController#process_action 
+2

क्या आपने अभी डेविस को अपग्रेड किया था? यदि हां, तो से- और किस संस्करण में? – rossta

+1

हां और नहीं। इससे पहले मैंने सीधे रेपो से सीधे लिंक किया था: 'मणि' डेविस ',: git =>' git: // github.com/plataformatec/devise.git''। मैंने इसे अपने जीमेल में वापस जोड़ा और ऐसा लगता है कि समस्या हल हो गई है। बहुत बहुत धन्यवाद। क्या आपको लगता है कि मैंने अपग्रेड किया था, हालांकि? –

+3

यह अनुमान लगाया गया था कि आपके सत्र डेटा को deserializing करते समय आपको त्रुटि मिल रही थी। यदि परिवर्तन को क्रमबद्ध/deserialize करने के लिए कोड, क्योंकि यह एक devise अप/डाउनग्रेड में हो सकता है, तो आप पहले मौजूदा सत्र deserializing त्रुटियों को देखेंगे। – rossta

उत्तर

3

मैं 2.2.4 के लिए 2.0.4 से अद्यतन और जब मैं पुराने संस्करण के साथ अपने प्रोजेक्ट की एक स्थिर शाखा करने के लिए बदल कि मुझे क्या हुआ। समाधान मेरे स्थानीयहोस्ट के लिए ब्राउज़र में सभी कुकीज़ को साफ़ करना था। आपके मामले में वह सर्वर होगा जहां आप अपना आवेदन चला रहे हैं।

+0

यह मेरा दिन बना - आधे दिन नाली के विचार से नीचे !! चीयर्स। –

0

प्रश्न बहुत समय पहले पोस्ट किया गया था, इसलिए मुझे लगता है कि मूल व्यक्ति को अब जवाब की आवश्यकता नहीं है। लेकिन मेरे जैसे लोग हो सकते हैं जो सभी उपहासों को उड़ाने के अलावा किसी अन्य उत्तर के लिए बेताब आवश्यकता में हैं। यहां कारण और मेरा समाधान है: डेविस 2.2.4 में पिछड़े असंगत परिवर्तन हैं जो सभी मौजूदा सत्र को तोड़ते हैं। वसीयत के द्वारा बनाई गई 2.2.4 https://github.com/plataformatec/devise/blob/master/CHANGELOG.md

सत्र> = 2.2.4 सही ढंग से चिंतन करना < = 2.2.3 द्वारा नियंत्रित नहीं किया जा सकता है के लिए परिवर्तन लॉग देखें।

समस्या सत्र कुंजी कुंजी से उपयोग की जाती है। मान लीजिए कि आपने अपने प्लेयर मॉडल पर तैयार किया है। वसीयत < = 2.2.3 के लिए, सत्र सत्र में निम्नलिखित

session["warden.user.player.key']=["Player", [player_id], "somehashhere"] 

वसीयत के लिए है> = 2.2.4, सत्र के बाद

session["warden.user.player.key']=[[player_id], "somehashhere"] 

मैं वसीयत लेखक डॉन 'लगता हो जाता है टी "प्लेयर" की तरह टी क्योंकि यह पहले से ही कई अलग-अलग स्थानों के साथ-साथ कुंजी में भी निर्दिष्ट है। यह एक उचित परिवर्तन है और नया कोड अपग्रेड को सही तरीके से संभालता है क्योंकि यह पुराने सत्रों को समझ सकता है और आपके उत्कृष्ट सत्रों को जीवंत रखता है।

लेकिन यह केवल अपग्रेड के लिए समस्या हल करता है, डाउनग्रेड नहीं। यदि आप अपनी रचना को 2.2.4 पर अपग्रेड करते हैं, तो लॉग इन करें और फिर 2.2.3 पर डाउनग्रेड करें, तो आपको इस तरह की एक त्रुटि दिखाई देगी। स्पष्ट रूप से कहीं भी डिवीज कोड (< 2.2.3) में यह 'प्ले' को प्रतीक में परिवर्तित करता है: उपयोगकर्ता। लेकिन 'उपयोगकर्ता' अब और नहीं है और आपको 'प्रतीक नहीं' त्रुटि मिली है।

डेविस पृष्ठ केवल समाधान के लिए इंगित करता है यदि आप सत्र के लिए डीबी स्टोरेज का उपयोग करते हैं। आपको लगता है कि https://gist.github.com/moll/6417606

आप का उपयोग करते हैं, कुकी संग्रह भंडारण (एक लंबे समय के लिए रेल डिफ़ॉल्ट) के लिए एक प्रवास की आवश्यकता होगी, तो आप जब आप युक्ति के बाद वाले संस्करण से डाउनग्रेड आवेदन नियंत्रक के लिए निम्न कोड जोड़ने की जरूरत

before_filter :fix_session 
def fix_session 
    key = session["warden.user.player.key"] 
    if key && key.is_a?(Array) && key[0].is_a?(Array) 
     session["warden.user.player.key"].unshift('Player') 
    end 
end 

क्यों डाउनग्रेडिंग के लिए? यदि आप सुनिश्चित हैं कि सबकुछ काम करता है और आपको कभी भी रोलबैक नहीं करना पड़ेगा तो यह कोई मुद्दा नहीं है।लेकिन अगर आप इतना यकीन नहीं कर रहे हैं, तो आपको इसकी आवश्यकता होगी।