2013-04-08 7 views
5

Sự phát sinh đang ném ra một vấn đề mà tôi không hiểu.Vấn đề phát hiện ẩn danh: "[17] không phải là biểu tượng"

Sử dụng lỗi đá quý tốt hơn; đây là nơi mà nó bị kẹt:

khối trong constantize (đá quý) 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 

Thông tin chi tiết:

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 

Bất kỳ ý tưởng ? Thông tin gì sẽ hữu ích hơn?

Dưới đây là một đoạn ra khỏi cuối của các dấu vết:

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

Bạn vừa mới nâng cấp Devise? Nếu có, từ và đến phiên bản nào? – rossta

+1

Có và không. Trước đó, tôi đã liên kết trực tiếp với repo với: 'gem 'devise',: git => 'git: // github.com/plataformatec/devise.git''. Tôi đã thêm nó vào gemfile của tôi và dường như đã giải quyết được vấn đề. Cảm ơn rất nhiều. Điều gì khiến bạn cho rằng tôi đã nâng cấp, tuy nhiên? –

+3

Đó là một dự đoán xem bạn đã nhận được lỗi trong khi deserializing dữ liệu phiên của bạn. Nếu mã để tuần tự hóa/deserialize thay đổi, vì nó có thể trong một lập/hạ cấp, bạn sẽ thấy lỗi deserializing phiên trước đó hiện có. – rossta

Trả lời

3

tôi cập nhật từ 2.0.4 đến 2.2.4 và đã xảy ra khi tôi thay đổi thành một chi nhánh ổn định của dự án của tôi với phiên bản cũ. Giải pháp là xóa tất cả cookie trong trình duyệt cho localhost của tôi. Trong trường hợp của bạn sẽ là máy chủ nơi bạn đang chạy ứng dụng của mình.

+0

Điều này làm cho ngày của tôi - nửa ngày xuống suy nghĩ cống! Chúc mừng. –

0

Câu hỏi đã được đăng một thời gian dài trước đây vì vậy tôi cho rằng người gốc không cần câu trả lời nữa. Nhưng có thể có những người như tôi đang tuyệt vọng cần một câu trả lời khác ngoài việc thổi bay tất cả những lời nói. Đây là nguyên nhân và giải pháp của tôi: Devise 2.2.4 có các thay đổi không tương thích ngược phá vỡ tất cả các phiên hiện có. Xem nhật ký thay đổi cho 2.2.4 https://github.com/plataformatec/devise/blob/master/CHANGELOG.md

Phiên được tạo bởi devise> = 2.2.4 không thể xử lý chính xác bằng cách đưa ra < = 2.2.3.

Sự cố xuất phát từ khóa phiên được sử dụng. Giả sử bạn đã nghĩ ra mô hình Trình phát của mình. Đối với devise < = 2.2.3, phiên có sau trong phiên

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

cho devise> = 2.2.4, phiên trở thành sau

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

Tôi cho rằng tác giả devise don' t giống như "Người chơi" vì nó đã được chỉ định ở nhiều nơi khác nhau cũng như chính khóa đó. Đó là một thay đổi hợp lý và mã mới không xử lý việc nâng cấp chính xác vì nó có thể hiểu các phiên cũ và giữ cho các phiên còn tồn tại của bạn luôn hoạt động.

Nhưng điều đó chỉ giải quyết được vấn đề để nâng cấp chứ không phải hạ cấp. Nếu bạn nâng cấp thiết lập của mình lên 2.2.4, hãy đăng nhập và sau đó hạ cấp xuống 2.2.3, bạn sẽ thấy lỗi như thế này. Rõ ràng một nơi nào đó trong mã phát minh (< 2.2.3) nó chuyển đổi 'Chơi' thành biểu tượng: người dùng. Nhưng 'Người dùng' không còn ở đó nữa và bạn gặp lỗi 'không phải là biểu tượng'.

Chỉ ra các điểm trang cho giải pháp chỉ khi bạn sử dụng bộ nhớ db cho phiên. Bạn sẽ cần một sự chuyển đổi cho rằng https://gist.github.com/moll/6417606

Nếu bạn sử dụng cookie lưu trữ lưu trữ (đường ray mặc định trong một thời gian dài), sau đó bạn cần phải thêm đoạn mã sau để điều khiển ứng dụng khi bạn hạ cấp từ phiên bản sau này của 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 

Còn về lý do hạ cấp? Nếu bạn chắc chắn rằng tất cả mọi thứ hoạt động và bạn sẽ không bao giờ phải quay trở lại thì nó không phải là một vấn đề.Nhưng nếu bạn không chắc chắn, bạn sẽ cần điều này.