2012-02-02 13 views
7

Trong khi khắc phục sự cố không đúng với Spree nơi danh sách sản phẩm không được phân trang và chỉ liệt kê 10 sản phẩm đầu tiên, tôi đã cố gắng tạo lại lỗi trong môi trường phát triển địa phương và tải trang đầu tiên tôi nhận được lỗi:Nguyên nhân gây ra lỗi "ArgumentError (lỗi định dạng kết xuất)"?

ArgumentError (dump format error) 

Như mọi khi, tôi đã kiểm tra bộ não khác của mình trước. Kết quả tìm kiếm hàng đầu là: https://github.com/rails/rails/issues/2509

Mặc dù người dùng đã bắt đầu chuỗi đó và một số áp phích khác đang cố gắng nâng cấp từ Rails 3.0.9 lên Rails 3.1, tôi không nghĩ nó sẽ áp dụng cho trường hợp của tôi. Ứng dụng Spree 0.60.2 tôi đang chạy ở Rails 3.0.9.

Tuy nhiên, khi nó quay ra, chỉ cần xóa cookie cục bộ của tôi đã giải quyết được sự cố. Tại sao?

Trả lời

10

Tôi sẽ suy đoán rằng vì tôi đang chạy nhiều ứng dụng trong môi trường phát triển của mình, bao gồm phiên bản Rails 3.1/Spree 0.70 của cùng một ứng dụng và tôi truy cập tất cả chúng thông qua localhost, trong một số loại cookie, trong đó phiên bản 3.1 đặt một số cookie mà phiên bản 3.0.9 không thể ăn được. Có thể bạn phải làm gì với những gì @Fjan đề cập trong bài đăng của mình tại đây (https://github.com/rails/rails/issues/2509):

I traced this error and it happens because the FlashHash class in the session has been changed to no longer inherit from the Hash class in rails 3.1.

Tôi đã chạy thử nghiệm. Miễn là tôi đã làm không phải đăng nhập trên một trong hai phiên bản của ứng dụng, tôi có thể bắt đầu một và tắt nó xuống và bắt đầu khác và không chạy vào vấn đề này trên một trong hai. Tuy nhiên, khi tôi đăng nhập vào phiên bản 3.0.9 và sau đó tắt máy chủ đó và khởi chạy phiên bản 3.1, tôi đã nhận được lỗi tương tự một lần nữa. Đây là một phần dấu vết:

activesupport (3.1.1) lib/active_support/message_verifier.rb:34:in load' activesupport (3.1.1) lib/active_support/message_verifier.rb:34:in verify' actionpack (3.1.1) lib/action_dispatch/middleware/cookies.rb:280:in []' actionpack (3.1.1) lib/action_dispatch/middleware/session/cookie_store.rb:53:in block in unpacked_cookie_data' actionpack (3.1.1) lib/action_dispatch/middleware/session/abstract_store.rb:55:in stale_session_check!' actionpack (3.1.1) lib/action_dispatch/middleware/session/cookie_store.rb:51:in unpacked_cookie_data' rack (1.3.6) lib/rack/session/cookie.rb:96:in extract_session_id' actionpack (3.1.1) lib/action_dispatch/middleware/session/abstract_store.rb:51:in block in extract_session_id' actionpack (3.1.1) lib/action_dispatch/middleware/session/abstract_store.rb:55:in stale_session_check!' actionpack (3.1.1) lib/action_dispatch/middleware/session/abstract_store.rb:51:in extract_session_id' rack (1.3.6) lib/rack/session/abstract/id.rb:43:in load_session_id!' rack (1.3.6) lib/rack/session/abstract/id.rb:32:in []' rack (1.3.6) lib/rack/session/abstract/id.rb:252:in current_session_id' rack (1.3.6) lib/rack/session/abstract/id.rb:258:in session_exists?' rack (1.3.6) lib/rack/session/abstract/id.rb:104:in exists?' rack (1.3.6) lib/rack/session/abstract/id.rb:114:in load_for_read!' rack (1.3.6) lib/rack/session/abstract/id.rb:64:in has_key?' actionpack (3.1.1) lib/action_dispatch/middleware/flash.rb:260:in ensure in call' actionpack (3.1.1) lib/action_dispatch/middleware/flash.rb:261:in call' rack (1.3.6) lib/rack/session/abstract/id.rb:195:in context' rack (1.3.6) lib/rack/session/abstract/id.rb:190:in `call'

Điều ngược lại cũng đúng. Khi tôi đăng nhập vào phiên bản 3.1 và sau đó tắt máy chủ đó và khởi chạy phiên bản 3.0.9, tôi đã nhận được lỗi tương tự. Dưới đây là một phần dấu vết:

activesupport (3.0.9) lib/active_support/message_verifier.rb:34:in load' activesupport (3.0.9) lib/active_support/message_verifier.rb:34:in verify' actionpack (3.0.9) lib/action_dispatch/middleware/cookies.rb:253:in []' actionpack (3.0.9) lib/action_dispatch/middleware/session/cookie_store.rb:68:in block in unpacked_cookie_data' actionpack (3.0.9) lib/action_dispatch/middleware/session/abstract_store.rb:223:in stale_session_check!' actionpack (3.0.9) lib/action_dispatch/middleware/session/cookie_store.rb:66:in unpacked_cookie_data' actionpack (3.0.9) lib/action_dispatch/middleware/session/cookie_store.rb:57:in extract_session_id' actionpack (3.0.9) lib/action_dispatch/middleware/session/abstract_store.rb:39:in load_session_id!' actionpack (3.0.9) lib/action_dispatch/middleware/session/abstract_store.rb:27:in []' actionpack (3.0.9) lib/action_dispatch/middleware/session/abstract_store.rb:210:in current_session_id' actionpack (3.0.9) lib/action_dispatch/middleware/session/abstract_store.rb:239:in exists?' actionpack (3.0.9) lib/action_dispatch/middleware/session/abstract_store.rb:96:in exists?' actionpack (3.0.9) lib/action_dispatch/middleware/session/abstract_store.rb:113:in load_for_read!' actionpack (3.0.9) lib/action_dispatch/middleware/session/abstract_store.rb:53:in []' actionpack (3.0.9) lib/action_dispatch/middleware/flash.rb:178:in call' actionpack (3.0.9) lib/action_dispatch/middleware/session/abstract_store.rb:149:in call'

Điều đáng chú ý là bạn không thực sự đang trong quá trình nâng cấp. Để tái tạo vấn đề này, bạn chỉ cần chạy hai ứng dụng mở rộng hai phiên bản Rails này đang đặt cookie có cùng tên ... có lẽ là theo thứ tự (như trong thử nghiệm của tôi) hoặc đồng thời (mà tôi chưa thử).

Hy vọng rằng, một người nào khác ở đây sẽ cung cấp câu trả lời sáng suốt hơn điều này để thêm chi tiết giải thích lỏng lẻo này thiếu. Trong thời gian chờ đợi, nếu bạn đang gặp vấn đề này trong phát triển và bạn không quan tâm đến hoạt động bên trong, chỉ cần xóa cookie của bạn (như đề xuất bởi @tscolari trong chuỗi được tham chiếu ở trên: https://github.com/rails/rails/issues/2509) và di chuyển. Chúc mừng.

+0

về cơ bản điều này chỉ xảy ra trong phát triển? tôi không nghĩ vậy. Tôi không chạy hai ứng dụng cùng một lúc. –

+0

Nó không phải là quá nhiều mà vấn đề là duy nhất cho một môi trường phát triển, nó chỉ là nó có nhiều khả năng được gặp phải ở đó. Bạn rất có thể sẽ gặp sự cố này trong môi trường sản xuất nếu bạn đang trong quá trình nâng cấp. Bối cảnh của bạn là gì. –

+0

Chúng tôi xây dựng một viên ngọc để dễ dàng di chuyển flash giữa các phiên bản đường ray khác nhau: https://github.com/envato/rails_4_session_flash_backport – sj26

2

Xóa cookie của bạn sẽ giải quyết được vấn đề này, hãy thử mở ứng dụng của bạn bằng một trình duyệt khác hoặc ẩn danh trên chrome, nó sẽ hoạt động tốt.

2

Nếu bạn đang ở trên sản xuất và bạn không thể yêu cầu người dùng của bạn để xóa các tập tin cookie :) - cách duy nhất là thay đổi quan trọng trong session_store config/initializers/session_store.rb

Giải pháp là không tốt đẹp, người dùng sẽ phải để đăng nhập lại.

3

Tôi gặp phải sự cố tương tự. Xoá cookie trình duyệt đã giải quyết được sự cố. chế độ phát triển.

0

Tôi đã gặp phải vấn đề tương tự về sản xuất ngay sau khi chuyển sang đường ray 3.2.

Thay đổi khóa session_store như được đề xuất bởi @povkys có thể hơi quá mức trong trường hợp của tôi vì chỉ một số người dùng (dưới 1%) gặp sự cố với phiên của họ.

Tôi đã kết thúc chạy một tập lệnh để phân tích cú pháp thông qua tất cả các phiên trong cơ sở dữ liệu và xóa những phiên không hợp lệ. Đây là mã, trong trường hợp nó giúp ai đó:

current_id = 0 
failed_count = 0 
while (sessions = ActiveRecord::Base.connection.select_all("Select id, data from sessions where id > #{current_id} limit 1000")).count > 0 do 
    failed_ids = [] 
    sessions.each do |s| 
    begin 
     ActiveRecord::SessionStore::Session.unmarshal(s['data']) 
    rescue 
     failed_count += 1 
     failed_ids.push s['id'] 
    end 
    end 

    ActiveRecord::Base.connection.execute("DELETE FROM sessions WHERE id in (#{failed_ids.join ','})") unless failed_ids.empty? 
    current_id = sessions.last['id'] 
end 
failed_count