2013-04-08 1 views
5

Devise는 내가 이해하지 못하는 문제를 던지고 있습니다.익명 개발자 ​​문제 : "[17]은 기호가 아닙니다."

더 나은 오류 사용하기 gem; 여기가 잡힐 어디 :

constantize (보석)의 블록 activesupport-3.2.12/lib 디렉토리/active_support/인플/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

Devise를 업그레이드하셨습니까? 그렇다면 어떤 버전에서? – rossta

+1

예 아니요. 이전에 저는 단순히 gem 'devise', : git => 'git : // github.com/plataformatec/devise.git'를 사용하여 repo에 직접 연결했습니다. 내 gemfile이 다시 추가하고 문제를 해결할 것으로 보인다. 매우 감사합니다. 그러나 내가 업그레이드했다고 가정 할 수 있었던 이유는 무엇입니까? –

+3

세션 데이터를 비 직렬화하는 동안 오류가 발생했다는 생각이 들었습니다. 위/아래 방향 변경에서와 같이 변경 사항을 serialize/deserialize하는 코드가 있으면 기존 세션을 비 직렬화하는 동안 오류가 발생합니다. – rossta

답변

3

나는 2.2.4에 2.0.4에서 업데이트 내가 이전 버전과 내 프로젝트의 안정적인 지점으로 변경하는 경우 그 날 일어났다. 해결 방법은 내 localhost 용 브라우저의 모든 쿠키를 지우는 것이 었습니다. 귀하의 경우 응용 프로그램을 실행중인 서버가됩니다.

+0

이것은 나의 하루를 만들었다 - 0.5 일 유출 물 생각의 아래에서!! 건배. –

0

질문이 오래 전에 게시되었으므로 원래 사람이 대답을 더 이상 필요로하지 않는다고 가정합니다. 그러나 모든 견학을 날려 버리는 것 이외에 답을 절실히 필요로하는 나와 같은 사람들이 있을지도 모릅니다. 그 원인과 해결책은 다음과 같습니다. Devise 2.2.4에는 기존의 모든 세션을 중단시키는 이전의 호환되지 않는 변경 사항이 있습니다. 2.2.4가 제대로 유증 < = 2.2.3에서 처리 할 수 ​​없습니다> = 유증에 의해 만들어진 2.2.4 https://github.com/plataformatec/devise/blob/master/CHANGELOG.md

세션의 변경 로그를 참조하십시오.

문제는 사용 된 세션 키로 인해 발생합니다. Player 모델을 고안했다고 가정 해 보겠습니다. 유증 < = 2.2.3의 경우, 세션은 유증의 경우

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

세션에서 다음이> = 2.2.4, 세션은 다음

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

내가 고안 저자 돈을 '가정이된다 "Player"와 비슷합니다. 이미 다른 장소와 키 자체에서 이미 지정 되었기 때문입니다. 그것은 합리적인 변화이며 새 코드는 이전 세션을 이해하고 뛰어난 세션을 유지하면서 업그레이드를 올바르게 처리합니다.

하지만 업그레이드가 아니라 다운 그레이드 문제가 해결됩니다. 기기를 2.2.4로 업그레이드하고 로그인 한 다음 2.2.3으로 다운 그레이드하면 다음과 같은 오류가 표시됩니다. 분명히 코드 어딘가에 (< 2.2.3) 그것은 '재생'을 기호 : 사용자로 변환합니다. 그러나 '사용자'는 더 이상 존재하지 않으며 '기호가 아닙니다'오류가 발생합니다.

Devise 페이지는 세션에 대해 db 저장소를 사용하는 경우에만 솔루션을 가리 킵니다. 당신은, 당신은 당신이 유증의 이후 버전에서 다운 그레이드 할 때 응용 프로그램 컨트롤러에 다음 코드를 추가 할 필요가 https://gist.github.com/moll/6417606

당신이 사용하는 경우 쿠키를 저장 저장 (오랫동안 레일 디폴트)에 대한 마이그레이션을 필요

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 

왜 다운 그레이드할까요? 모든 것이 작동하고 롤백 할 필요가 없다고 확신하는 경우 문제가되지 않습니다.그러나 당신이 확실하지 않다면, 당신은 이것을 필요로 할 것입니다.

관련 문제