+6

Sử dụng Active Storage trong rails 5.2

Mở đầu

Active Storage là một phần mềm được tích hợp sẵn trong Rails 5.2, nó xử lý các file tải lên các dịch vụ lưu trữ từ Amazon, Google và Microsoft. Lưu vào ở cứng và cũng có thể sử dụng trong cho môi development và test environments. điều đặc biệt là nó là một gem thay thế cho Paperclip, Carrierwave, Dragonfly.

Cài đặt

Bạn có thể sử dụng một project có sẳn hoặc có thể tạo mới để thử nghiệm như tôi

install the rails 5.2 beta gem 
gem install rails -v 5.2.0.beta2

sau đó tiến hành bước Migration:

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 bụ lưu trử của bạn or ổ 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.

Active Record Model

Giả sử bạn muốn đính kèm một hoặc nhiều hình ảnh vào một Nhận xét. Đầu tiên, chúng ta phải tạo ra model Comment. Chúng ta sẽ sử dụng generator để tạo resource:

rails g resource comment content:text

Một tập tin

bạn không cần sử dụng Blob and Attachment trực tiếp để có thể đính một hình ảnh vào một nhận xét hãy sử dụng has_one_attached

class Comment < ApplicationRecord
  has_one_attached :image
end

bạn cũng không cần phải tạo một model image để lưu trử chúng Active Storage sử dụng lob and Attachment bên dưới để làm công viêc đó rồi:

comment.image

tiếp theo chúng ta xây dựng controller và view:

class CommentController < ApplicationController
  def new
    comment = Comment.new
  end

  def create
    comment = Comment.create! params.require(:comment).permit(:content)
    comment.image.attach(params[:comment][:image])
    redirect_to comment    
  end

  def show
    comment = Comment.find(paramd[:id])
  end
end
# new.html.erb
<%= form_with model: @comment, local: true  do |form| %>
  <%= form.text_area :content %><br><br>
  <%= form.file_field :image, %><br>
  <%= form.submit %>
<% end %>
# show.html.erb
<%= image_tag @comment.image %>

Active Storage sử dụng comment.image.attach(params[:comment][:images]) trong action create để gán trường image vào đối tượng comment và để hiển thị hình ảnh chúng ta dùng @comment.image đến image_tag

Nhiều tập tin

Để có thể đính kèm nhiều tập tin chúng ta cần phải chỉnh lại một chút cho phù hợp mà thôi

  • sử dụng has_many_attached thay vì has_one_attached
  • comment.images thay vì comment.image
  • multiple: truetrên file_field để có thể upload nhiều file
class Comment < ApplicationRecord
  has_many_attached :image
end
class CommentController < ApplicationController
  def new
    comment = Comment.new
  end

  def create
    comment = Comment.create! params.require(:comment).permit(:content)
    comment.images.attach(params[:comment][:images])
    redirect_to comment    
  end

  def show
    comment = Comment.find(paramd[:id])
  end
end
# new.html.erb
<%= form_with model: @comment, local: true  do |form| %>
  <%= form.text_area :content %><br><br>
  <%= form.file_field :images, multiple: true %><br>
  <%= form.submit %>
<% end %>
# show.html.erb
<% @comment.images.each do |image| %>
  <%= image_tag image %> <br />
<% end %>

Cấu hình

Active Storage mặc định được kích hoạt khi bạn tao một ứng dụng rails mới config/active_storage.yml sẽ được tự động tạo ra và config.active_storage.service là bô đến :local trên cả hai môi trường development.rbproduction.rb. local được cấu hình để sử dụng trên ổ cứng và các storage danh mục được sử dụng.

local:
  service: Disk
  root: <%= Rails.root.join("storage") %>

Để thay đổi điều này ta có thể config config.active_storage.service đến :amazon,:google, hoặc là :microsoftvà thiết lập các giá trị thích hợp trênconfig/storage.yml. Đối với Amazon S3. chúng ta có thể pass qua access_key_id , secret_access_key, regionbucket Đối với Google Cloud Storage, bạn có thể pass project, keyfile, và bucket và đối với Microsoft Azure Storage, bạn có thể pass path, storage_account_name, storage_access_key, và container. Chúng ta cũng cần thêm Gem cần thiết vào Gemfile cho dịch vụ bạn chọn. Điều này có thể sử dụng được cho aws-sdk-s3, google-cloud-storage, hoặc là azure-storage.

Phần kết

Active Storage giúp dễ dàng xử lý tải lên tệp lên các dịch vụ lưu trữ. Chúng ta mới chỉ làm những công việc cơ bản ở đây. Trong một bài đăng trong tương lai(không gần 😃) ), chúng ta sẽ nói về các tính năng nâng cao như tải lên trực tiếp và các biến thể của hình ảnh đó 😃.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí