Migrating from one file attachment library to another can be a challenging task, but with Rails’ built-in Active Storage, the process becomes much smoother.
Step 1: Preparing the Application
Install the Active Storage gem by adding it to your Gemfile:
1 gem 'activestorage'
Run the bundle install command:
1 bundle install
active_storage:install command to generate the necessary migrations:
1 rails active_storage:install
Configure Active Storage by setting up the desired storage service (local or cloud-based) in
Configure the desired storage service in
1 config.active_storage.service = :local # or :amazon, :google, etc.
Step 2: Adapting the Model
Update the model that uses Paperclip to switch to Active Storage. For example, if you have a model named
Attachment with a Paperclip attachment named
file, you would make the following changes:
1 2 3 4 5 6 7 class Attachment < ApplicationRecord # Remove Paperclip attachment declaration # has_attached_file :file, ... # Add Active Storage attachment declaration has_one_attached :file end
Update the model associations and validations related to the attachment. For example, if you have a
User model that has many
attachments with Paperclip, you would modify it as follows:
1 2 3 4 5 6 7 class User < ApplicationRecord # Remove the Paperclip association # has_many :attachments, as: :attachable # Add the Active Storage association has_many_attached :attachments end
Step 3: Updating the Views and Controllers
Replace any Paperclip-specific view code with Active Storage equivalents. For example, if you were displaying an image using Paperclip, you would modify the view code as follows:
1 2 3 4 5 <!-- Before --> <%= image_tag @attachment.file.url %> <!-- After --> <%= image_tag url_for(@attachment.file) %>
Adjust the view code to render the appropriate URLs for Active Storage attachments. For example, if you had a download link for a Paperclip attachment, you would update it as follows:
1 2 3 4 5 <!-- Before --> <%= link_to 'Download', @attachment.file.url %> <!-- After --> <%= link_to 'Download', url_for(@attachment.file) %>
Modify the controller actions to handle file uploads using Active Storage. For example, if you had a
create action in your controller that handled file uploads with Paperclip, you would update it as follows:
1 2 3 4 5 6 7 8 9 def create @attachment = Attachment.new(attachment_params) @attachment.file.attach(params[:attachment][:file]) # Attach the file using Active Storage if @attachment.save # ... else # ... end end
Step 4: Data Migration
Create a new data migration to transfer existing Paperclip attachments to Active Storage. For example:
1 $ rails generate migration MigratePaperclipAttachmentsToActiveStorage
In the generated migration file, write the migration code to transfer the attachments. Here’s an example:
1 2 3 4 5 6 7 8 9 10 11 12 13 class MigratePaperclipAttachmentsToActiveStorage < ActiveRecord::Migration[6.1] def up Attachment.find_each do |attachment| attachment.file.attach(io: File.open(attachment.file.path), filename: attachment.file_file_name) end end def down # If needed, implement a rollback method end end
Step 5: Testing and Cleanup
Update existing tests or add new tests to ensure proper functionality after the migration.
Remove any Paperclip-related code, migrations, or configuration files from the project.