5

设计提出了一个我不明白的问题。

使用更好的错误 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
4

2 回答 2

3

我从 2.0.4 更新到 2.2.4,当我使用旧版本更改为我的项目的稳定分支时发生了这种情况。解决方案是为我的本地主机清除浏览器中的所有 cookie。在您的情况下,将是您运行应用程序的服务器。

于 2013-07-03T16:05:53.523 回答
0

这个问题是很久以前发布的,所以我想原来的人不再需要答案了。但可能有像我这样的人迫切需要一个答案,而不是炸毁所有会话。这是原因和我的解决方案:Devise 2.2.4 具有向后不兼容的更改,会破坏所有现有会话。请参阅 2.2.4 的更改日志 https://github.com/plataformatec/devise/blob/master/CHANGELOG.md

devise >=2.2.4 创建的会话不能被 devise <=2.2.3 正确处理。

问题来自使用的会话密钥设计。假设您已经设计了 Player 模型。对于设计<=2.2.3,会话在会话中具有以下内容

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

对于 devise>=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

如果你使用 cookie store 存储(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

至于为什么降级?如果您确定一切正常并且您永远不必回滚,那么这不是问题。但是,如果您不确定,您将需要这个。

于 2014-02-10T21:08:59.293 回答