ActiveStorage: Lưu trữ file trong ứng dụng Rails
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 ...
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
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ế.
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")) %>
- 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.
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