设计正在抛出一个我不明白的问题。
使用更好的错误gem;这是被抓住的地方:
阻止constantize(gem)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
答案 0 :(得分:3)
我从2.0.4更新到2.2.4,当我用旧版本更改为项目的稳定分支时发生这种情况。解决方案是清除浏览器中我的localhost的所有cookie。在您的情况下,您将运行应用程序的服务器。
答案 1 :(得分:0)
这个问题是很久以前发布的,所以我想原来的人不再需要答案了。但是,像我这样的人可能迫切需要一个答案,而不是炸毁所有的争吵。这是原因和我的解决方案: Devise 2.2.4具有向后不兼容的更改,会破坏所有现有会话。请参阅2.2.4的更改日志 https://github.com/plataformatec/devise/blob/master/CHANGELOG.md
devise< = 2.2.3无法正确处理由devise> = 2.2.4创建的会话。
问题来自使用的会话密钥设计。假设你已经设计了你的玩家模型。对于设计< = 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)的某处,它将'Play'转换为symbol:user。但是'用户'不再存在,而且你有一个'非符号'的错误。
仅当您使用数据库存储进行会话时,才将页面指向解决方案。您需要进行迁移 https://gist.github.com/moll/6417606
如果您使用cookie存储存储(长时间默认使用rails),那么当您从更高版本的设备降级时,需要将以下代码添加到应用程序控制器
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
至于降级的原因?如果您确定一切正常并且您永远不必回滚那么这不是问题。但如果你不太确定,你就需要这个。