5

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
4

2 に答える 2

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 モデルに工夫があるとしましょう。Devise<=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) のどこかで、'Play' がシンボル :user に変換されます。しかし、「ユーザー」はもう存在せず、「シンボルではありません」というエラーが発生します。

Devise ページは、セッションに db ストレージを使用する場合にのみ解決策を示します。そのための移行が必要になり ます https://gist.github.com/moll/6417606

Cookie ストア ストレージを使用している場合 (長い間 Rails のデフォルト)、devise の新しいバージョンからダウングレードするときに、次のコードをアプリケーション コントローラーに追加する必要があります。

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 に答える