julienbourdeau / debugbar

Powerful devtools for Ruby on Rails. Inspired by the Laravel Debugbar.
https://debugbar.dev
MIT License
487 stars 8 forks source link

Puma caught this error: undefined method `body' for Rack::Files::Iterator #21

Open raihanM99 opened 9 months ago

raihanM99 commented 9 months ago

In my Rails project, I encountered an issue related to handling attachments. Specifically, when accessing a page that invokes an attachment from Active Storage using (e.g <%= user.avatar %>), an error occurred.

Puma caught this error: undefined method `body' for #<Rack::Files::Iterator:0x00007a6444b5d0b0 @path="/app/storage/up/0j/up0jdccu1cxhetiqc4esuczuufde", @ranges=[0..13031], @options={:mime_type=>"text/plain", :size=>13032}>

      @stream.body
             ^^^^^ (NoMethodError)
/gems/ruby/3.1.0/gems/actionpack-7.0.4/lib/action_dispatch/http/response.rb:305:in `body'
/gems/ruby/3.1.0/gems/debugbar-0.2.2/lib/debugbar/request.rb:94:in `response_hash'
/gems/ruby/3.1.0/gems/debugbar-0.2.2/lib/debugbar/request.rb:60:in `to_h'
.
.
.

This issue arose due to Rails generating a URL every time it accesses the Active Storage attachment.

"GET /uploads/disk/active_storage_long_key/avatar1.jpg"

To resolve this, I modified the configuration in the config/initializers/debugbar.rb file to ignore /uploads, which successfully resolved the issue

Debugbar.configure do |config|
  config.ignore_request = -> (env) { env['PATH_INFO'].start_with? '/uploads' }
end
bitsmyth commented 2 months ago

@raihanM99 thank you!

I also checked if it is defined as test and production do not load debugbar and therefor will break the initialization.

if defined? Debugbar
  Debugbar.configure do |config|
    config.ignore_request = ->(env) { env["PATH_INFO"].start_with? "/uploads" }
  end
end
gtrias commented 2 days ago

Hello! I'm having the same problem but this workaround doesn't fit very well into our system since we get this errors from a GraphQL endpoint on which you would need to introspect the query to know if it's dealing with files.

It's also a pity not being able to see requests involving files in debugbar. Would it be possible to use another mechanism to generate response_hash here? https://github.com/julienbourdeau/debugbar/blob/master/lib/debugbar/request.rb#L94 Why it needs to use response.body for it?

I would be happy to contribute if you guide me on how to do so :)