0

Uploading Files Into Ruby On Rails ActiveStorage

Mở đầu

Khi lưu trữ các tệp trong Rails, bộ công cụ đầu tiên mà ta tiếp cận là các gem của bên thứ 3 như: CarrierWave hoặc Paperclip (trước khi không dùng nữa để thay thế cho Active Storage). Active Storage được giới thiệu với Rails 5.2.

Active Storage tạo điều kiện tải tệp lên dịch vụ lưu trữ đám mây như Amazon S3, Google Cloud Storage hoặc Microsoft Azure Storage và đính kèm các tệp đó vào các đối tượng Active Record. Nó đi kèm với một dịch vụ local disk-based để phát triển và thử nghiệm, đồng thời hỗ trợ sao chép tệp tới các dịch vụ cấp dưới để sao lưu và di chuyển.

Sử dụng Active Storage, một ứng dụng có thể chuyển đổi các tệp tải lên hình ảnh với ImageMagick, tạo các bản trình bày hình ảnh của các tệp tải lên không phải hình ảnh như PDF và video cũng như trích xuất siêu dữ liệu từ các tệp tùy ý.

Thực hiện

Vào terminal và tạo một ứng dụng rails mới

rails new app

Tạo ứng dụng, tạo blog app đơn giản với scaffold command.

rails g scaffold Post title:string content:text

Sau khi quá trình hoàn thành, chạy migrate

rails db:migrate

Sau đó vào tùy chỉnh routes

Rails.application.routes.draw do
  resources :posts
  root to: 'posts#index'
end

Bây giờ ta sẽ thêm ảnh vào bài đăng của mình. Đầu tiên ta cần cài đặt active storage vào bài đăng của mình.

rails active_storage:install

Sau khi chạy lệnh này, Rails sẽ tạo một file migration cho bạn. Khi kiểm tra sẽ thấy tạo 2 bảng khác nhau: active_storage_blobs và active_storage_attachments.

Sau đó ta chạy file migrate

rails db:migrate

Tiếp theo ta thêm vào model như sau:

class Post < ApplicationRecord
  has_one_attached :image
end

Một lần nữa, chúng ta sẽ cần thêm image vào controller của mình ở cuối method post_params, thêm image vào các thuộc tính của modle.

def post_params
  params.require(:post).permit(:title, :content, :image)
 end

Trong app/view/posts/_form.html.erb, chúng ta sẽ chỉnh sửa tệp bằng cách thêm input thêm image.

<div class="field">
 <%= form.label :image %>
 <%= form.file_field :image %>
</div>

Bây giờ chúng ta cần tải hình ảnh trong index và show

#app/views/posts/index.html.erb

<% if post.image.attached? %>
  <td><%= image_tag post.image %></td>
<% end %>
#app/views/posts/show.html.erb

<p>
  <% if @post.image.attached? %>
    <%= image_tag @post.image %>
  <% end %>
</p>

Bây giờ ta hoàn toàn có thể đăng ảnh kèm trong bài post, tuy nhiên bây giờ chúng ta muốn khi đăng bài post bắt buộc phải có ảnh kèm theo, ta sử dụng gem active_storage_validations. Ta thêm gem "active_storage_validations" vào trong gem file và bundle install. Sau đó :

# app/models/post.rb

validates :image, attached: true, content_type: %i[png jpg jpeg]

Với validation trên ta chỉ chấp nhận những ảnh có đuôi png, jpg và jpeg kèm theo đó khi tạo post cần phải có ảnh đính kèm khi tạo post. Như vậy là ta có thể đăng post có kèm theo file ảnh.

Nguồn tham khảo:

https://hackernoon.com/uploading-files-into-ruby-on-rails-activestorage-gv1r3ukr


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í