2013-04-08 7 views
5

Devise wirft ein Problem auf, das ich nicht verstehe.Anonymes Problem: "[17] ist kein Symbol"

Verwenden von besseren Fehlern gem; hier, wo es verfängt:

Block in constantize (gem) Active-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 

Weitere Informationen:

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 

Irgendwelche Ideen ? Welche weiteren Informationen wären hilfreich?

Hier ist ein Stück über das Ende der Spur:

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

Haben Sie gerade Devise aktualisiert? Wenn ja, von und zu welcher Version? – rossta

+1

Ja und Nein. Zuvor hatte ich einfach direkt mit dem Repo verbunden: 'gem 'devise',: git => 'git: // github.com/plataformatec/devise.git'. Ich habe das in meiner gemfile hinzugefügt und es scheint das Problem gelöst zu haben. Vielen Dank. Was hat dich dazu gebracht anzunehmen, dass ich aufgerüstet habe? –

+3

Es war eine Vermutung, dass Sie den Fehler beim Deserialisieren Ihrer Sitzungsdaten erhalten haben. Wenn der Code zum Serialisieren/Deserialisieren von Änderungen, wie dies bei einem Up-/Downgrade des Devices der Fall sein könnte, würden Sie feststellen, dass zuvor geöffnete Sessions deserialisiert werden. – rossta

Antwort

3

ich von 2.0.4 bis 2.2.4 aktualisiert und das passierte mich, wenn ich zu einem stabilen Zweig von meinem Projekt mit der alten Version geändert. Die Lösung war, alle Cookies im Browser für meinen localhost zu löschen. In Ihrem Fall wäre der Server, auf dem Sie Ihre Anwendung ausführen.

+0

Das machte meinen Tag - einen halben Tag den Bach runter gedacht !! Prost. –

0

Die Frage wurde vor langer Zeit gestellt, also nehme ich an, dass die ursprüngliche Person die Antwort nicht mehr benötigt. Aber vielleicht gibt es Menschen wie mich, die dringend eine Antwort brauchen, außer dass sie alle Sitzungen in die Luft sprengen. Hier ist die Ursache und meine Lösung: Devise 2.2.4 hat rückwärts inkompatible Änderungen, die alle vorhandenen Sitzung bricht. Siehe das Änderungsprotokoll für 2.2.4

Sitzungen, die mit device> = 2.2.4 erstellt wurden, können nicht korrekt vom Gerät verarbeitet werden < = 2.2.3.

Das Problem kommt von den verwendeten Sitzungsschlüssel-Geräten. Nehmen wir an, Sie haben sich Ihr Player-Modell ausgedacht. Für devise < = 2.2.3 hat die Sitzung im Anschluss an den in der Sitzung

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

für devise> = 2.2.4, wird die Sitzung der folgenden

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

ich die devise Autor Don annehmen‘ t wie der "Player", wie er bereits an vielen verschiedenen Orten angegeben ist, sowie der Schlüssel selbst. Es ist eine vernünftige Änderung und der neue Code kümmert sich korrekt um das Upgrade, da es die alten Sitzungen verstehen und Ihre ausstehenden Sitzungen am Leben erhalten kann.

Aber das löst nur das Problem für das Upgrade, nicht Downgrade. Wenn Sie Ihr Gerät auf 2.2.4 aktualisieren, sich anmelden und dann auf 2.2.3 herunterstufen, wird ein Fehler wie dieser angezeigt. Scheinbar irgendwo im Gerätecode (< 2.2.3) wandelt er das 'Play' in ein Symbol um: user. Aber der "Benutzer" ist nicht mehr da und du hast einen Fehler "kein Symbol".

Entwickeln Sie Seitenpunkte nur dann zu einer Lösung, wenn Sie den db-Speicher für die Sitzung verwenden. Sie würden für das https://gist.github.com/moll/6417606

eine Migration benötigen Wenn Sie Cookie speichern Speicher (Schienen Standard für eine lange Zeit) verwenden, dann müssen Sie den folgenden Code Anwendungssteuerung hinzufügen, wenn Sie aus der späteren Version von devise degradieren

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 

Warum für Downgrade? Wenn Sie sicher sind, dass alles funktioniert und Sie nie ein Rollback durchführen müssen, ist das kein Problem.Aber wenn Sie nicht so sicher sind, werden Sie das brauchen.

Verwandte Themen