Rails Active Storage

Tram Ho

1. Giớ thiệu

Nếu như trước phiên bản Rails 5.2, để thực hiện việc upload file thì hầu hết ta luôn cần đến thư viện bên thứ 3, một trong số đó nổi tiếng nhất là gem CarrierWave – đó là một gem rất bền vững và được cộng đồng tin dùng nhiều nhất. Nhưng từ Rails 5.2 trở đi thì ta có thêm một lựa chọn khác là Active Storage. Không giống như CarrierWave, Active Storage được tích hợp sẵn trong Rails hay nói cách khác nó được phát triển bỡi Rails, vì vậy ta hoàn toàn yên tâm khi sữ dụng

2. Cài đặt

Migration

Mặc dù Active Storage được tích hợp sẵn trong Rails nhưng default nó chưa được install khi chạy rails new. Để install Active Storage ta chạy câu lênh sau:

Sau khi chạy hai câu lệnh trên thì nó sẽ tạo cho ta hai table trong DB có tên active_storage_blobsactive_storage_attachments. Về mặc lưu trữ dữ liệu thực chất Active Storage sữ dụng quan hệ Polymorphic trong rails, active_storage_blobs chứa thông tin của files, còn active_storage_attachments là một join table polymorphic lưu class name của model.

Setting

Chúng ta thực hiện Khai báo các dịch vụ Active Storage trong config/storage.yml. Đối với mỗi dịch vụ mà ứng dụng của ta sử dụng, hãy cung cấp tên và cấu hình cần thiết. Ví dụ dưới đây khai báo ba dịch vụ có tên local, test và amazon:

Để cho Active Storage biết dịch vụ nào được sử dụng bằng cách thiết lập Rails.application.config.active_storage.service tương ứng với mỗi môi trường bởi vì mỗi môi trường có thể sẽ sử dụng một dịch vụ khác nhau.
Ví dụ để sử dụng dịch vụ Disk trong môi trường development, ta sẽ thêm phần sau vào config/environment/development.rb:

Hay sữ dụng s3production thì ta thiết lập ở config/environments/production.rb:

3. Sử dụng

Active Storage cho phép chúng ta có thể attach một hoặc nhiều files cho một record bằng cách sử dụng các macro tương ứng là has_one_attachedhas_many_attached.
Để minh họa ta xét ví dụ sau, một user chỉ có 1 avatar hoặc một product có nhiều image. Để thực hiện ví dụ đó ta cần tạo các model User và Product như sau:

has_one_attached

Bên trong User model:

Bên trong controller và view

Như vậy là ta có thể tạo avatar cho user mà ko cần tạo thêm field avatar trong bảng users hoặc bảng nào khác. Ngoài ra, để attach một avatar tới một user đã tồn tại trước đó ta có thể dùng user.avatar.attach(params[:avatar]) hoặc kiểm tra user đã được attach avatar chưa bằng cách user.avatar.attached?

has_many_attached

Product có nhiều images:

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo