Active Storage makes it simple to upload and reference files in cloud services, like Amazon S3 or Google Cloud Storage, and attach those files to Active Records. It also provides a disk service for testing or local deployments, but the focus is on cloud storage.
One attachment:
class User < ApplicationRecord
has_one_attached :avatar
end
user.avatar.attach io: File.open("~/face.jpg"), filename: "avatar.jpg", content_type: "image/jpg"
user.avatar.exist? # => true
user.avatar.purge
user.avatar.exist? # => false
user.avatar.url(expires_in: 5.minutes) # => /rails/blobs/<encoded-key>
class AvatarsController < ApplicationController
def update
Current.user.avatar.attach(params.require(:avatar))
redirect_to Current.user
end
end
Many attachments:
class Message < ApplicationRecord
has_many_attached :images
end
<%= form_with model: @message do |form| %>
<%= form.text_field :title, placeholder: "Title" %><br>
<%= form.text_area :content %><br><br>
<%= form.file_field :images, multiple: true %><br>
<%= form.submit %>
<% end %>
class MessagesController < ApplicationController
def create
message = Message.create! params.require(:message).permit(:title, :content)
message.images.attach(params[:message][:images])
redirect_to message
end
end
- Add
require "active_storage"
to config/application.rb. - Run
rails activestorage:install
to create needed directories, migrations, and configuration. - Configure the storage service in
config/environments/*
withconfig.active_storage.service = :local
that references the services configured inconfig/storage_services.yml
.
- Document all the classes
- Strip Download of its resposibilities and delete class
- Proper logging
- Convert MirrorService to use threading
- Read metadata via Marcel?
- Add Migrator to copy/move between services
- Explore direct uploads to cloud
- Extract VerifiedKeyWithExpiration into Rails as a feature of MessageVerifier
Active Storage is released under the MIT License.