Skip to content
File Attachment toolkit for Ruby applications
Ruby JavaScript Other
Branch: master
Clone or download

Latest commit

Files

Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github Set up sponsorship button Nov 6, 2019
demo Bump Uppy version to 1.8.0 in demo app Feb 3, 2020
doc Additional documentation on atomic persistence (#478) May 24, 2020
lib Delete removed attachment if new file was attached right after removal May 18, 2020
test Delete removed attachment if new file was attached right after removal May 18, 2020
website Update Docusaurus to 1.14.4 and dependencies Apr 26, 2020
.dockerignore Switch website and docs to Docusaurus (#419) Oct 14, 2019
.gitignore Switch website and docs to Docusaurus (#419) Oct 14, 2019
.travis.yml Add Ruby 2.7 to Travis CI matrix Feb 3, 2020
Brewfile Remove test with ImageProcessing tempfile on S3 Nov 10, 2015
CHANGELOG.md Delete removed attachment if new file was attached right after removal May 18, 2020
CODE_OF_CONDUCT.md Update CoC to v2.0 (#452) Mar 24, 2020
CONTRIBUTING.md Fixes some missing formatting of code texts May 25, 2020
Dockerfile Switch website and docs to Docusaurus (#419) Oct 14, 2019
Gemfile Use ActiveRecord/ActiveSupport 6.x for newer Rubies Jan 11, 2020
LICENSE.txt Update copyright year to 2019 Nov 10, 2019
README.md Update README.md (#451) Mar 23, 2020
Rakefile Switch website and docs to Docusaurus (#419) Oct 14, 2019
shrine.gemspec Use ActiveRecord/ActiveSupport 6.x for newer Rubies Jan 11, 2020

README.md

Shrine

Shrine logo: a red paperclip

Shrine is a toolkit for handling file attachments in Ruby applications. Some highlights:

If you're curious how it compares to other file attachment libraries, see the Advantages of Shrine. Otherwise, follow along with the Getting Started guide.

Links

Resource URL
Website & Documentation shrinerb.com
Demo code Roda / Rails
Wiki github.com/shrinerb/shrine/wiki
Help & Discussion discourse.shrinerb.com

Setup

Add the gem to your Gemfile:

# Gemfile
gem "shrine", "~> 3.0"

Then add config/initializers/shrine.rb which sets up the storage and loads ORM integration:

require "shrine"
require "shrine/storage/file_system"

Shrine.storages = {
  cache: Shrine::Storage::FileSystem.new("public", prefix: "uploads/cache"), # temporary
  store: Shrine::Storage::FileSystem.new("public", prefix: "uploads"),       # permanent
}

Shrine.plugin :activerecord           # loads Active Record integration
Shrine.plugin :cached_attachment_data # enables retaining cached file across form redisplays
Shrine.plugin :restore_cached_data    # extracts metadata for assigned cached files

Next, add the <name>_data column to the table you want to attach files to. For an "image" attachment on a photos table this would be an image_data column:

$ rails generate migration add_image_data_to_photos image_data:text

Now create an uploader class (which you can put in app/uploaders) and register the attachment on your model:

class ImageUploader < Shrine
  # plugins and uploading logic
end
class Photo < ActiveRecord::Base
  include ImageUploader::Attachment(:image) # adds an `image` virtual attribute
end

In our views let's now add form fields for our attachment attribute that will allow users to upload files:

<%= form_for @photo do |f| %>
  <%= f.hidden_field :image, value: @photo.cached_image_data %>
  <%= f.file_field :image %>
  <%= f.submit %>
<% end %>

When the form is submitted, in your controller you can assign the file from request params to the attachment attribute on the model:

class PhotosController < ApplicationController
  def create
    Photo.create(photo_params) # attaches the uploaded file
    # ...
  end

  private

  def photo_params
    params.require(:photo).permit(:image)
  end
end

Once a file is uploaded and attached to the record, you can retrieve the file URL and display it on the page:

<%= image_tag @photo.image_url %>

See the Getting Started guide for further documentation.

Inspiration

Shrine was heavily inspired by Refile and Roda. From Refile it borrows the idea of "backends" (here named "storages"), attachment interface, and direct uploads. From Roda it borrows the implementation of an extensible plugin system.

Similar libraries

  • Paperclip
  • CarrierWave
  • Dragonfly
  • Refile
  • Active Storage

Contributing

Please refer to the contributing page.

Code of Conduct

Everyone interacting in the Shrine project’s codebases, issue trackers, and mailing lists is expected to follow the Shrine code of conduct.

License

The gem is available as open source under the terms of the MIT License.

You can’t perform that action at this time.