Sử dụng Active Storage trong rails 5.2
Bài đăng này đã không được cập nhật trong 6 năm
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.rb
và production.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à :microsoft
và 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
, region
và bucket
Đố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