Just to verify, Shrine::Storage::S3 uses aws-sdk v2, so it's not `S3Object` anymore but `Aws::S3::Object`. Also the aws-sdk v2 doesn't have `#url_for` method, it only has `#presigned_url` and `#public_url`.
If you pull in Shrine from the master branch, the Shrine::Storage::S3#object which was "protected" before is now public, so you can call it on `image.storage` (it's simpler than `Shrine.storages[:store]`):
image.storage #=> #<Shrine::Storage::S3:...>
If you don't want to pull Shrine from master, you can access the Aws::S3::Object through the bucket directly. Then you just have the add the S3 prefix if you're using it in your storage:
image.storage.bucket.object([*image.storage.prefix,
image.id].join("/"))
However, considering that `image.url` will call `#presigned_url` by default, and `#public_url` if you call `image.url(public: true)`, and you can pass any additional options which will be forwarded to those methods, you shouldn't ever have to use `Aws::S3::Object` directly for generating URLs.
Btw, aws-sdk v2 also has `Aws::S3::ObjectSummary`, but when I call `image.storage.bucket.object(...)` I get a `Aws::S3::Object` back, so I cannot reproduce the behaviour you're experiencing. I don't know what does aws-sdk use `Aws::S3::ObjectSummary` for, but it seems to have the same methods as `Aws::S3::Object`.
Kind regards,
Janko