12/08/2018, 15:43

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")) %>
  1. Thêm gem "activestorage", git: "https://github.com/rails/activestorage.git" to your Gemfile.
  2. Thêm require "active_storage" vào file config/application.rb, sau dòng "rails/all".
  3. Chạy "rails activestorage:install" để tạo directories, migrations, and configuration cần thiết.
  4. 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.
  5. Optional: Thêm gem "aws-sdk", "~> 2" to your Gemfile nếu muốn sử dụng AWS S3.
  6. Optional: Thêm gem "google-cloud-storage", "~> 1.3" to your Gemfile nếu muốn sử dụng Google Cloud Storage.
  7. 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

0