2015-06-18 15 views
6

Chúng tôi đã nâng cấp lên Rails 4, đã có một số vấn đề lớn và hạ cấp lại (hoàn nguyên cam kết nâng cấp).Lỗi như "NoMethodError: undefined method` sweep 'cho # <Hash ... "sau khi hạ cấp xuống Rails 3 từ Rails 4

Sau đó chúng tôi đã nhận lỗi như

NoMethodError (undefined method `sweep' for #<Hash:0x007f01ab44a940>): 

dường như vì Rails 4 cửa hàng một đèn flash trong phiên theo một cách mà Rails 3 không thể đọc được.

Cách tốt nhất để giải quyết vấn đề này là gì?

Trả lời

8

Chúng tôi đã kết thúc việc giải quyết vấn đề này bằng cách tự vá Rails để bắt lỗi này và xóa đèn flash bị bẻ khóa. Điều này có nghĩa là nó tự hồi phục khá rõ ràng.

Chúng tôi cũng thực hiện đảm bảo chỉ áp dụng bản vá này on Rails 3, vì vậy nó không gây ra vấn đề khi chúng ta thực hiện một nỗ lực nâng cấp lên Rails 4.

Chúng tôi bị mắc kẹt này trong config/initializers/rails4_to_rails3_downgradability.rb:

if Rails::VERSION::MAJOR == 3 

    module ActionDispatch 
    class Flash 
     def call(env) 
     if (session = env['rack.session']) && (flash = session['flash']) 

      # Beginning of change! 

      if flash.respond_to?(:sweep) 
      flash.sweep 
      else 
      session.delete("flash") 
      end 

      # End of change! 

     end 

     @app.call(env) 
     ensure 
     session = env['rack.session'] || {} 
     flash_hash = env[KEY] 

     if flash_hash 
      if !flash_hash.empty? || session.key?('flash') 
      session["flash"] = flash_hash 
      new_hash = flash_hash.dup 
      else 
      new_hash = flash_hash 
      end 

      env[KEY] = new_hash 
     end 

     if session.key?('flash') && session['flash'].empty? 
      session.delete('flash') 
     end 
     end 
    end 
    end 

end 
3

Đối mặt với cùng một vấn đề, được giải quyết bằng cách yêu cầu người dùng xóa cookie. Có thể không phải là giải pháp cho mọi người, chỉ ra rằng đó là một lựa chọn.

+0

Chắc chắn là một điểm tốt. Cảm ơn bạn đã đóng góp! –

Các vấn đề liên quan