Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ActiveStorage: Fail more gracefully if file is not found using DiskService #33647

Closed
cbothner opened this Issue Aug 17, 2018 · 4 comments

Comments

Projects
None yet
2 participants
@cbothner
Copy link
Contributor

cbothner commented Aug 17, 2018

I propose that Errno:ENOENT arising from ActiveStorage DiskService should be rescued and should return 404.

Motivation

It is very common for developers using ActiveStorage to use a cloud service in production and DiskService in development. Also, I doubt I’m the only one who copies my production database on to my development machine as a general practice. That means that when ActiveStorage::Blobs are resolved, valid references to S3 become invalid references to ./storage/... Especially when loading an index page that displays many attached images, the log is drowned in very long stack traces for the numerous Errno:ENOENT errors that arise. It’s a bad development experience.

Implementation (?)

If people think this is a good idea, I’d like to tackle it. This is what I’m thinking, although it could be quite off base.

I could simply add

rescue_from Errno::ENOENT do
  head :not_found
end

to ActiveStorage::DiskController and ActiveStorage::RepresentationsController.

Alternatively, if that’s too specific for the level of abstraction those controllers are at, I could modify ActiveStorage::Service::DiskService to raise a more semantic error (ActiveStorage::FileNotFoundError?) that could be handled somewhere. (Is there an engine-specific version of config.action_dispatch.rescue_responses?)

I welcome your thoughts and hope you find this a reasonable proposal. I would love to stop having to run Thing.all.each { |x| x.image.detach } every time I clone down my production db.

@georgeclaghorn

This comment has been minimized.

Copy link
Member

georgeclaghorn commented Aug 17, 2018

👍 for translating Errno::ENOENT (and other service-specific missing-object exceptions, like Google::Cloud::NotFoundError) into a generic Active Storage exception. I’m fine with rescuing that new exception and generating a 404 response in DiskController. From the service’s perspective, it’s not exceptional for an arbitrary key not to exist.

I’m less sure about RepresentationsController, since it is exceptional from the app’s perspective for the service not to have an object that corresponds to a specific blob in the DB.

@cbothner

This comment has been minimized.

Copy link
Contributor Author

cbothner commented Aug 17, 2018

Okay, I’ll make sure the not found errors from all the services are taken care of. That seems like a good thing to do even if it seems less likely to occur with a cloud provider.

I understand your reasoning for RepresentationsController. I agree that it is exceptional, but I wonder if there’s still a way to improve the developer experience. Is it possible to abbreviate the stack trace in the logs the way that ActiveRecord::RecordNotFound is, while keeping it an exception/still returning 500?

@georgeclaghorn

This comment has been minimized.

Copy link
Member

georgeclaghorn commented Aug 18, 2018

I just remembered that DiskController reads files stored on disk without going through the disk service, so we’ll need to rescue Errno::ENOENT there even if the service translates Errno::ENOENT into a generic exception. The service should still translate for the Blob#download call sites elsewhere.

Can you share the stack trace you see for Errno::ENOENT? I’m not seeing one in a sample app:

irb(main):002:0> ActiveStorage::Blob.service.download("foo")
  Disk Storage (0.9ms) Downloaded file from key: foo
Traceback (most recent call last):
        1: from (irb):2
Errno::ENOENT (No such file or directory @ rb_sysopen - /Users/george/Code/shift/storage/fo/o/foo)
@cbothner

This comment has been minimized.

Copy link
Contributor Author

cbothner commented Aug 18, 2018

Sounds good, DiskController needing to rescue Errno::ENOENT explicitly.

Here is an example of the stack traces I’m talking about. This is, in a sample app, the log output of one page load that has this on the page.

  <img src="<%= url_for @user.image %>" />
  <img src="<%= url_for @user.image.variant resize: "100x100" %>" />

To simulate having copied down the prod db, and the corresponding references that break when the active storage service is changed from s3 to disk, I deleted the contents of ./storage/

Stacktrace
Started GET "/users/1" for ::1 at 2018-08-18 09:12:25 -0400
Processing by UsersController#show as HTML
  Parameters: {"id"=>"1"}
  User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  ↳ app/controllers/users_controller.rb:68
  Rendering users/show.html.erb within layouts/application
  ActiveStorage::Attachment Load (0.7ms)  SELECT  "active_storage_attachments".* FROM "active_storage_attachments" WHERE "active_storage_attachments"."record_id" = ? AND "active_storage_attachments"."record_type" = ? AND "active_storage_attachments"."name" = ? LIMIT ?  [["record_id", 1], ["record_type", "User"], ["name", "image"], ["LIMIT", 1]]
  ↳ app/views/users/show.html.erb:3
  ActiveStorage::Blob Load (0.3ms)  SELECT  "active_storage_blobs".* FROM "active_storage_blobs" WHERE "active_storage_blobs"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  ↳ app/views/users/show.html.erb:3
  Rendered users/show.html.erb within layouts/application (4.6ms)
Completed 200 OK in 33ms (Views: 28.8ms | ActiveRecord: 1.4ms)


Started GET "/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--692d58d198b1c729082f72e8901c069704a6d66b/headshot.jpg" for ::1 at 2018-08-18 09:12:27 -0400
Processing by ActiveStorage::BlobsController#show as JPEG
  Parameters: {"signed_id"=>"eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--692d58d198b1c729082f72e8901c069704a6d66b", "filename"=>"headshot"}
  ActiveStorage::Blob Load (0.1ms)  SELECT  "active_storage_blobs".* FROM "active_storage_blobs" WHERE "active_storage_blobs"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  ↳ /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
  Disk Storage (0.4ms) Generated URL for file at key: 4nxHcM3tvfWdvyULAodxSr1z (http://localhost:3210/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaEpJaDAwYm5oSVkwMHpkSFptVjJSMmVWVk1RVzlrZUZOeU1Yb0dPZ1pGVkE9PSIsImV4cCI6IjIwMTgtMDgtMThUMTM6MTc6MjcuMDQwWiIsInB1ciI6ImJsb2Jfa2V5In19--cf3cb0d0b97304d147f09ab89703926e9ccd4337/headshot.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22headshot.jpg%22%3B+filename%2A%3DUTF-8%27%27headshot.jpg)
Redirected to http://localhost:3210/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaEpJaDAwYm5oSVkwMHpkSFptVjJSMmVWVk1RVzlrZUZOeU1Yb0dPZ1pGVkE9PSIsImV4cCI6IjIwMTgtMDgtMThUMTM6MTc6MjcuMDQwWiIsInB1ciI6ImJsb2Jfa2V5In19--cf3cb0d0b97304d147f09ab89703926e9ccd4337/headshot.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22headshot.jpg%22%3B+filename%2A%3DUTF-8%27%27headshot.jpg
Completed 302 Found in 2ms (ActiveRecord: 0.1ms)


Started GET "/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaEpJaDAwYm5oSVkwMHpkSFptVjJSMmVWVk1RVzlrZUZOeU1Yb0dPZ1pGVkE9PSIsImV4cCI6IjIwMTgtMDgtMThUMTM6MTc6MjcuMDQwWiIsInB1ciI6ImJsb2Jfa2V5In19--cf3cb0d0b97304d147f09ab89703926e9ccd4337/headshot.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22headshot.jpg%22%3B+filename%2A%3DUTF-8%27%27headshot.jpg" for ::1 at 2018-08-18 09:12:27 -0400
Processing by ActiveStorage::DiskController#show as JPEG
  Parameters: {"content_type"=>"image/jpeg", "disposition"=>"inline; filename=\"headshot.jpg\"; filename*=UTF-8''headshot.jpg", "encoded_key"=>"eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaEpJaDAwYm5oSVkwMHpkSFptVjJSMmVWVk1RVzlrZUZOeU1Yb0dPZ1pGVkE9PSIsImV4cCI6IjIwMTgtMDgtMThUMTM6MTc6MjcuMDQwWiIsInB1ciI6ImJsb2Jfa2V5In19--cf3cb0d0b97304d147f09ab89703926e9ccd4337", "filename"=>"headshot"}
  Disk Storage (0.2ms) Downloaded file from key: 4nxHcM3tvfWdvyULAodxSr1z
Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.0ms)



Errno::ENOENT (No such file or directory @ rb_sysopen - /Users/etalli/Documents/Personal/Code/sample/storage/4n/xH/4nxHcM3tvfWdvyULAodxSr1z):
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activestorage-5.2.1/lib/active_storage/service/disk_service.rb:28:in `initialize'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activestorage-5.2.1/lib/active_storage/service/disk_service.rb:28:in `open'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activestorage-5.2.1/lib/active_storage/service/disk_service.rb:28:in `block in download'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activesupport-5.2.1/lib/active_support/notifications.rb:168:in `block in instrument'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activesupport-5.2.1/lib/active_support/notifications/instrumenter.rb:23:in `instrument'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activesupport-5.2.1/lib/active_support/notifications.rb:168:in `instrument'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activestorage-5.2.1/lib/active_storage/service.rb:118:in `instrument'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activestorage-5.2.1/lib/active_storage/service/disk_service.rb:27:in `download'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activestorage-5.2.1/app/controllers/active_storage/disk_controller.rb:17:in `show'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionpack-5.2.1/lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionpack-5.2.1/lib/abstract_controller/base.rb:194:in `process_action'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionpack-5.2.1/lib/action_controller/metal/rendering.rb:30:in `process_action'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionpack-5.2.1/lib/abstract_controller/callbacks.rb:42:in `block in process_action'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activesupport-5.2.1/lib/active_support/callbacks.rb:132:in `run_callbacks'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionpack-5.2.1/lib/abstract_controller/callbacks.rb:41:in `process_action'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionpack-5.2.1/lib/action_controller/metal/rescue.rb:22:in `process_action'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionpack-5.2.1/lib/action_controller/metal/instrumentation.rb:34:in `block in process_action'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activesupport-5.2.1/lib/active_support/notifications.rb:168:in `block in instrument'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activesupport-5.2.1/lib/active_support/notifications/instrumenter.rb:23:in `instrument'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activesupport-5.2.1/lib/active_support/notifications.rb:168:in `instrument'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionpack-5.2.1/lib/action_controller/metal/instrumentation.rb:32:in `process_action'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionpack-5.2.1/lib/action_controller/metal/params_wrapper.rb:256:in `process_action'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activerecord-5.2.1/lib/active_record/railties/controller_runtime.rb:24:in `process_action'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionpack-5.2.1/lib/abstract_controller/base.rb:134:in `process'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionview-5.2.1/lib/action_view/rendering.rb:32:in `process'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionpack-5.2.1/lib/action_controller/metal/live.rb:255:in `block (2 levels) in process'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activesupport-5.2.1/lib/active_support/dependencies/interlock.rb:42:in `block in running'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activesupport-5.2.1/lib/active_support/concurrency/share_lock.rb:162:in `sharing'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activesupport-5.2.1/lib/active_support/dependencies/interlock.rb:41:in `running'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionpack-5.2.1/lib/action_controller/metal/live.rb:247:in `block in process'
  /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionpack-5.2.1/lib/action_controller/metal/live.rb:291:in `block in new_controller_thread'


Started GET "/rails/active_storage/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--692d58d198b1c729082f72e8901c069704a6d66b/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdCam9MY21WemFYcGxTU0lNTVRBd2VERXdNQVk2QmtWVSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--2154619373369eb6821c7f06c924071262ac9f2f/headshot.jpg" for ::1 at 2018-08-18 09:12:29 -0400
Processing by ActiveStorage::RepresentationsController#show as JPEG
  Parameters: {"signed_blob_id"=>"eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--692d58d198b1c729082f72e8901c069704a6d66b", "variation_key"=>"eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdCam9MY21WemFYcGxTU0lNTVRBd2VERXdNQVk2QmtWVSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--2154619373369eb6821c7f06c924071262ac9f2f", "filename"=>"headshot"}
  ActiveStorage::Blob Load (0.1ms)  SELECT  "active_storage_blobs".* FROM "active_storage_blobs" WHERE "active_storage_blobs"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  ↳ /Users/etalli/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
  Disk Storage (0.0ms) Checked if file exists at key: variants/4nxHcM3tvfWdvyULAodxSr1z/b376865481e6cfa955e856f830e3b74cf05bf7ce1484916de18188d58ad94328 (no)
  Disk Storage (0.2ms) Downloaded file from key: 4nxHcM3tvfWdvyULAodxSr1z
Completed 500 Internal Server Error in 2ms (ActiveRecord: 0.1ms)



Errno::ENOENT (No such file or directory @ rb_sysopen - /Users/etalli/Documents/Personal/Code/sample/storage/4n/xH/4nxHcM3tvfWdvyULAodxSr1z):

activestorage (5.2.1) lib/active_storage/service/disk_service.rb:28:in `initialize'
activestorage (5.2.1) lib/active_storage/service/disk_service.rb:28:in `open'
activestorage (5.2.1) lib/active_storage/service/disk_service.rb:28:in `block in download'
activesupport (5.2.1) lib/active_support/notifications.rb:168:in `block in instrument'
activesupport (5.2.1) lib/active_support/notifications/instrumenter.rb:23:in `instrument'
activesupport (5.2.1) lib/active_support/notifications.rb:168:in `instrument'
activestorage (5.2.1) lib/active_storage/service.rb:118:in `instrument'
activestorage (5.2.1) lib/active_storage/service/disk_service.rb:27:in `download'
activestorage (5.2.1) app/models/active_storage/blob.rb:161:in `download'
activestorage (5.2.1) lib/active_storage/downloading.rb:29:in `download_blob_to'
activestorage (5.2.1) app/models/active_storage/variant.rb:118:in `block in download_image'
mini_magick (4.8.0) lib/mini_magick/utilities.rb:29:in `block in tempfile'
mini_magick (4.8.0) lib/mini_magick/utilities.rb:27:in `tap'
mini_magick (4.8.0) lib/mini_magick/utilities.rb:27:in `tempfile'
mini_magick (4.8.0) lib/mini_magick/image.rb:115:in `create'
activestorage (5.2.1) app/models/active_storage/variant.rb:118:in `download_image'
activestorage (5.2.1) app/models/active_storage/variant.rb:107:in `open_image'
activestorage (5.2.1) app/models/active_storage/variant.rb:85:in `process'
activestorage (5.2.1) app/models/active_storage/variant.rb:53:in `processed'
activestorage (5.2.1) app/controllers/active_storage/representations_controller.rb:12:in `show'
actionpack (5.2.1) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
actionpack (5.2.1) lib/abstract_controller/base.rb:194:in `process_action'
actionpack (5.2.1) lib/action_controller/metal/rendering.rb:30:in `process_action'
actionpack (5.2.1) lib/abstract_controller/callbacks.rb:42:in `block in process_action'
activesupport (5.2.1) lib/active_support/callbacks.rb:132:in `run_callbacks'
actionpack (5.2.1) lib/abstract_controller/callbacks.rb:41:in `process_action'
actionpack (5.2.1) lib/action_controller/metal/rescue.rb:22:in `process_action'
actionpack (5.2.1) lib/action_controller/metal/instrumentation.rb:34:in `block in process_action'
activesupport (5.2.1) lib/active_support/notifications.rb:168:in `block in instrument'
activesupport (5.2.1) lib/active_support/notifications/instrumenter.rb:23:in `instrument'
activesupport (5.2.1) lib/active_support/notifications.rb:168:in `instrument'
actionpack (5.2.1) lib/action_controller/metal/instrumentation.rb:32:in `process_action'
actionpack (5.2.1) lib/action_controller/metal/params_wrapper.rb:256:in `process_action'
activerecord (5.2.1) lib/active_record/railties/controller_runtime.rb:24:in `process_action'
actionpack (5.2.1) lib/abstract_controller/base.rb:134:in `process'
actionview (5.2.1) lib/action_view/rendering.rb:32:in `process'
actionpack (5.2.1) lib/action_controller/metal.rb:191:in `dispatch'
actionpack (5.2.1) lib/action_controller/metal.rb:252:in `dispatch'
actionpack (5.2.1) lib/action_dispatch/routing/route_set.rb:52:in `dispatch'
actionpack (5.2.1) lib/action_dispatch/routing/route_set.rb:34:in `serve'
actionpack (5.2.1) lib/action_dispatch/journey/router.rb:52:in `block in serve'
actionpack (5.2.1) lib/action_dispatch/journey/router.rb:35:in `each'
actionpack (5.2.1) lib/action_dispatch/journey/router.rb:35:in `serve'
actionpack (5.2.1) lib/action_dispatch/routing/route_set.rb:840:in `call'
rack (2.0.5) lib/rack/tempfile_reaper.rb:15:in `call'
rack (2.0.5) lib/rack/etag.rb:25:in `call'
rack (2.0.5) lib/rack/conditional_get.rb:25:in `call'
rack (2.0.5) lib/rack/head.rb:12:in `call'
actionpack (5.2.1) lib/action_dispatch/http/content_security_policy.rb:18:in `call'
rack (2.0.5) lib/rack/session/abstract/id.rb:232:in `context'
rack (2.0.5) lib/rack/session/abstract/id.rb:226:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/cookies.rb:670:in `call'
activerecord (5.2.1) lib/active_record/migration.rb:559:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call'
activesupport (5.2.1) lib/active_support/callbacks.rb:98:in `run_callbacks'
actionpack (5.2.1) lib/action_dispatch/middleware/callbacks.rb:26:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/executor.rb:14:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:61:in `call'
web-console (3.6.2) lib/web_console/middleware.rb:135:in `call_app'
web-console (3.6.2) lib/web_console/middleware.rb:30:in `block in call'
web-console (3.6.2) lib/web_console/middleware.rb:20:in `catch'
web-console (3.6.2) lib/web_console/middleware.rb:20:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
railties (5.2.1) lib/rails/rack/logger.rb:38:in `call_app'
railties (5.2.1) lib/rails/rack/logger.rb:26:in `block in call'
activesupport (5.2.1) lib/active_support/tagged_logging.rb:71:in `block in tagged'
activesupport (5.2.1) lib/active_support/tagged_logging.rb:28:in `tagged'
activesupport (5.2.1) lib/active_support/tagged_logging.rb:71:in `tagged'
railties (5.2.1) lib/rails/rack/logger.rb:26:in `call'
sprockets-rails (3.2.1) lib/sprockets/rails/quiet_assets.rb:13:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/request_id.rb:27:in `call'
rack (2.0.5) lib/rack/method_override.rb:22:in `call'
rack (2.0.5) lib/rack/runtime.rb:22:in `call'
activesupport (5.2.1) lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/executor.rb:14:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/static.rb:127:in `call'
rack (2.0.5) lib/rack/sendfile.rb:111:in `call'
railties (5.2.1) lib/rails/engine.rb:524:in `call'
puma (3.12.0) lib/puma/configuration.rb:225:in `call'
puma (3.12.0) lib/puma/server.rb:658:in `handle_request'
puma (3.12.0) lib/puma/server.rb:472:in `process_client'
puma (3.12.0) lib/puma/server.rb:332:in `block in run'
puma (3.12.0) lib/puma/thread_pool.rb:133:in `block in spawn_thread'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.