Active Storage In Rails 5.2
Bài đăng này đã không được cập nhật trong 6 năm
Active Storage là 1 cập nhật mới của rails, được tích hợp sẵn trong phiên bản rails 5.2, hỗ trợ cho việc tải tệp lên các dịch vụ lưu trữ như Amazon S3, Google Cloud Storage hoặc Microsoft Azure và đính kèm các tệp đó vào đối tượng Active Record, nó có thể thay thế cho các gem trước đây chúng ta thường sử dụng như Paperclip, Carrierwave, Dragonfly.
Setup
bin/rails active_storage:install:migrations
bin/rails db:migrate
Đoạn migration này sẽ tạo cho chúng ta 2 bảng active_storage_blobs và active_storage_attachments dành cho 2 model đó là blog và tiệp đính kèm. Blog là nơi lưu trử những dữ liệu như tên file, loại, kích thước byte.... các tập tin thực tế sẽ được lưu trử trên dịch vụ lưu trữ của bạn hoặc ổ cứng tình thuộc vào chúng ta setting thế nào. một Blog có thể gán một hoặc nhiều đối tượng Active Record thông qua mô hình join Attachment.
Config để sử dụng active storage upload file đính kèm lên các dịch vụ mà bạn muốn sử dụng trong file config/storage.yml
:
local: //lưu cùng nơi với ứng dụng của bạn
service: Disk
root: <%= Rails.root.join("storage") %>
test:
service: Disk
root: <%= Rails.root.join("tmp/storage") %>
amazon: //sử dụng dịch vụ lưu trữ S3
service: S3
access_key_id: ""
secret_access_key: ""
bucket: ""
region: "" # e.g. 'us-east-1'
để sử dụng dịch vụ như đã config ở trên, ta cần thêm khai báo ở các file cấu hình của từng môi trường:
# Store files on Amazon S3.
config.active_storage.service = :amazon
lưu ý: để sử dụng dịch vụ S3 cần thêm gem "aws-sdk-s3"
Attaching Files to Records
has_one_attached
ví dụ ta có model user, mỗi user có 1 file ảnh:
class User < ApplicationRecord
has_one_attached :image
end
Tạo user với ảnh đính kèm:
<%= f.file_field :image %>
Trên controller bạn chỉ cần permit params :image là có thể đính ảnh trong khi tạo user. Đính kèm ảnh đến user đã có:
user.image.attach(params[:image])
Kiểm tra xem user đã có đính kèm chưa:
user.image.attached?
has_many_attached
Ví dụ 1 user có thể có nhiều file ảnh:
class User < ApplicationRecord
has_many_attached :images
end
Cách tạo user có đính kèm nhiều ảnh cũng tương tự như trên, chỉ khác permit params cần thêm images: []
Removing Files
Xóa ảnh đính kèm với user, đồng thời xóa luôn file đã upload: user.avatar.purge
Xóa ảnh đính kèm với user, đồng thời xóa luôn file đã upload thông qua Active Job: user.avatar.purge_later
Linking to Files
Để download file từ view, cần sử dụng rails_blob_{path|url}
helper, và đặt option disposition:
link_to user.image.filename, rails_blob_path(@user.image, disposition: 'attachment')
Để xem trước file, thay đổi option: disposition: 'preview'
Validates
Active Storage không hỗ trợ việc validate nên bạn có thể tự tạo ra các validate để truớc khi lưu nó, hoặc sử dụng gem active_storage_validations, có thể tham khảo tại đây
Ngoài ra active storage còn có thêm thư viện javascript để hỗ trợ việc upload file từ client lên dịch vụ sử dụng như hình dưới: Bạn có thể tham khảo thêm tại đây
Kết Luận
Active Storage làm cho việc upload file đính kèm lên các dịch vụ lưu trữ trở nên dễ dàng, được tích hợp sẵn trong rails. Hy vọng việc làm quen với gem mới này sẽ suôn sẻ với mọi người
Nguồn tham khảo: https://edgeguides.rubyonrails.org/active_storage_overview.html
All rights reserved