匿名设计问题:“[17]不是象征”

时间:2013-04-08 01:53:54

标签: ruby-on-rails devise

设计正在抛出一个我不明白的问题。

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

2 个答案:

答案 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

至于降级的原因?如果您确定一切正常并且您永远不必回滚那么这不是问题。但如果你不太确定,你就需要这个。