ActiveStorage: Lưu trữ file trong ứng dụng Rails
Bài đăng này đã không được cập nhật trong 7 năm
1. Active Storage
Active Storage giúp đơn giản hóa việc tải lên và tham chiếu tệp trong các dịch vụ đám mây, như Amazon S3 hoặc Google Cloud Storage, và đính kèm các tệp đó vào Active Records. Nó cũng cung cấp một dịch vụ disk để thử nghiệm hoặc triển khai nội bộ, nhưng vẫn tập trung vào lưu trữ đám mây. Các tệp tin có thể được tải lên từ máy chủ lên đám mây hoặc trực tiếp từ máy khách đến đám mây. Tập tin hình ảnh có thể tiếp tục nữa được chuyển đổi sử dụng các variants theo yêu cầu về chất lượng, tỉ lệ, kích thước, hoặc bất kỳ MiniMagick khác được hỗ trợ chuyển đổi. Hiệnại Active Storage vẫn đang được phát triển nhưng hứa hẹn là 1 giải pháp tuyệt vời của chính những nhà phát triển của Rails
2. So với các giải pháp lưu trữ khác
Sự khác biệt quan trọng đối với hoạt động của Active Storage so với các giải pháp đính kèm khác trong Rails là thông qua việc sử dụng mô hình Blob và Attachment tích hợp (hỗ trợ bởi Active Record). Điều này có nghĩa là các mô hình ứng dụng hiện tại không cần phải sửa đổi với các cột bổ sung để liên kết với các tệp tin. Active Storage sử dụng các hiệp định đa hình thông qua mô hình nối của Attachment, sau đó kết nối với Blob thực tế.
3. Ví dụ
Một tập tin đính kèm:
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.attached? # => true
user.avatar.purge
user.avatar.attached? # => false
url_for(user.avatar) # Generate a permanent URL for the blob, which upon access will redirect to a temporary service URL.
class AvatarsController < ApplicationController
def update
# params[:avatar] contains a ActionDispatch::Http::UploadedFile object
Current.user.avatar.attach(params.require(:avatar))
redirect_to Current.user
end
end
Nhiều tập đính kèm:
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 index
# Use the built-in with_attached_images scope to avoid N+1
@messages = Message.all.with_attached_images
end
def create
message = Message.create! params.require(:message).permit(:title, :content)
message.images.attach(params[:message][:images])
redirect_to message
end
def show
@message = Message.find(params[:id])
end
end
Sự thay đổi của tệp đính kèm hình ảnh:
<%# Hitting the variant URL will lazy transform the original blob and then redirect to its new service location %>
<%= image_tag url_for(user.avatar.variant(resize: "100x100")) %>
4. Cài đặt
- Thêm gem "activestorage", git: "https://github.com/rails/activestorage.git" to your Gemfile.
- Thêm require "active_storage" vào file config/application.rb, sau dòng "rails/all".
- Chạy "rails activestorage:install" để tạo directories, migrations, and configuration cần thiết.
- Cấu hình dịch vụ lưu trữ trong config/environments/* với config.active_storage.service =: local mà tham khảo các dịch vụ cấu hình trong config / storage_services.yml.
- Optional: Thêm gem "aws-sdk", "~> 2" to your Gemfile nếu muốn sử dụng AWS S3.
- Optional: Thêm gem "google-cloud-storage", "~> 1.3" to your Gemfile nếu muốn sử dụng Google Cloud Storage.
- Optional: Thêm gem "mini_magick" to your Gemfile nếu muốn sử dụng variant.
5. Khả năng tương thích & Kỳ vọng
Active Storage chỉ hoạt động với phiên bản development của Rails 5.2+ (tính đến ngày 19 tháng 7 năm 2017) Nguồn : https://github.com/rails/activestorage
All rights reserved