—
title: Shrine 2.4.0¶ ↑
New features¶ ↑
- 
The
default_url_optionsplugin accepts a block for dynamically generating options. 
plugin :default_url_options, store: ->(io, **options) do {response_content_disposition: "attachment; filename=\"#{io.original_filename}\""} end
- 
The
activerecordplugin supports JSON and JSONB PostgreSQL columns. 
Other improvements¶ ↑
- 
The FileSystem storage doesn’t raise an error when attempting to delete a file that doesn’t exist anymore. This behaviour has also been added to the storage linter.
 - 
Fixed
copyplugin running file validations when assigning copied file, which makes it not work withversionsplugin. - 
The S3 storage automatically sets the
Content-Dispositionheader with the original filename when uploading files. - 
The
<attachment>_dataattribute name has been extracted intoAttacher#data_attribute, so that it’s possible to override. - 
The value conversion around the data attribute has been refactored into
#convert_before_writeand#convert_after_readon the Attacher, so that it can be easily overriden in ORM plugins. - 
Work around aws-sdk gem failing if the
:content_dispositionupload option was passed to the S3 storage containing non-ASCII characters. This is also handled better when generating an URL or presign using the:response_content_dispositionoption, by URL-encoding the header value. - 
The previous change also makes the
Content-Dispositionoption handle properly filenames with double quotes. - 
UploadedFile#openandUploadedFile#downloaddon’t swallow errors raised byStorage#openanymore. - 
The
sequelplugin now uses less memory when creating large amount of records (see the Sequel commit for more details). - 
The
download_endpointplugin uses Roda’s streaming endpoint, which integrates better with EventMachine. - 
Shrine::Attachment#to_shas been added for better introspection when listing model ancestors withputs. 
Backwards compatibility¶ ↑
- 
The
download_endpointplugin doesn’t use the obsoleteStorage#streammethod anymore, and instead relies onStorage#opento implement streaming. All of the publicShrinestorages plugins already support streaming#openfor some time, by usingDown::ChunkedIO. - 
Shrinedoesn’t anymore explicitly unlink Tempfiles returned byStorage#openafter closing them. All external storages already useDown::ChunkedIOfor quite some time, which automatically unlinks the underlying Tempfile when#closeis called. But even if your storage returns Tempfiles, these should be automatically unlinked on garbage collection by your Ruby implementation. - 
The
:hostoption on FileSystem and S3 storage has been moved from a first-class storage option passed on#initializeto an URL option. The original:hostoption still works, but will be removed inShrine3. 
# now deprecated Shrine::Storage::S3.new(host: "http://abc123.cloudfront.net", **s3_options) # can be passed to #url s3 = Shrine::Storage::S3.new(**s3_options) s3.url(host: "http://abc123.cloudfront.net") # or can be set automatically using `default_url_options` plugin Shrine.plugin :default_url_options, store: {host: "http://abc123.cloudfront.net"}
- 
Accepting data in form of a JSON string by
Shrine.uploaded_filehas been deprecated,Attacher#uploaded_fileshould be used for it instead. Note thatShrine.uploaded_filewill still continue to accept Hash orUploadedFileobjects.