12/08/2018, 16:22

Tìm hiểu gem paperclip upload file với Rails

Dưới đây là gem paperclip mình đã tìm hiểu, tham khảo và chạy được nếu có thắc mắc hay câu hỏi gì mọi người vui lòng comment bên dưới để bài viết tốt hơn ạ. Paperclip có lẽ là giải pháp quản lý kèm theo phổ biến nhất cho Rails (hơn 13 triệu lượt download), và có nguyên do rõ ràng cho điều này: nó ...

Dưới đây là gem paperclip mình đã tìm hiểu, tham khảo và chạy được nếu có thắc mắc hay câu hỏi gì mọi người vui lòng comment bên dưới để bài viết tốt hơn ạ.

Paperclip có lẽ là giải pháp quản lý kèm theo phổ biến nhất cho Rails (hơn 13 triệu lượt download), và có nguyên do rõ ràng cho điều này: nó có nhiều tính năng, một cộng đồng tuyệt vời và hệ thống tài liệu dễ hiểu. Vì vậy hi vọng bạn sẽ thấy hào hứng khi tìm hiểu về gem này!

1. Chuẩn bị

Trước khi chúng ta tìm hiểu sâu vào phần mã nguồn, trước tiên hãy thảo luận về một số điều cần lưu ý mà bạn cần biết để có thể làm việc với Paperclip thành công:

  • Phiên bản mới nhất của Paperclip hỗ trợ Rails 4.2+ và Ruby 2.1+. Gem này cũng có thể sử dụng mà không cần Rails.
  • ImageMagick phải được cài đặt trên máy tính của bạn (nó có sẵn cho tất cả các nền tảng lớn), và Paperclip có thể truy cập vào nó.
  • Lệnh file có sẵn từ dòng lệnh. Đối với hệ điều hành Windows, phần này có sẵn thông qua Development Kit cho các nhà phát triển, vì vậy hãy làm theo những hướng dẫn này nếu bạn chưa cài đặt DevKit.
  • Khi bạn đã sẵn sàng, hãy tiếp tục và tạo một ứng dụng Rails mới:
rails new UploadingWithPaperclip -T

Đưa vào gem Paperclip:

  • Gemfile
gem "paperclip", "~> 5.1"

sau đó:

bundle install

Giả sử chúng ta đang tạo một ứng dụng quản lý sách trong đó có một danh sách các cuốn sách. Mỗi cuốn sách có một tiêu đề, một phần mô tả và tên tác giả, cùng với một hình ảnh bìa. Để bắt đầu, tổng hợp và áp dụng sự di trú sau:

rails g model Book title:string description:text image:attachment author:string
rails db:migrate

Lưu ý loại attachment được trình bày cho chúng tabằng Paperclip. Nó sẽ tạo ra bốn trường cho chúng ta:

  • tên_file_ảnh
  • kích_thước_file_ảnh
  • loại_nội_dung_ảnh
  • thời_gian_cập_nhật_ảnh Trái ngược với các gem Shrine và Carrierwave, Paperclip không có một tập tin riêng biệt với các cấu hình. Tất cả cài đặt được xác định bên trong các mô hình bằng cách sử dụng phương pháp has_attached_file, vì vậy ta hãy thêm nó ngay bây giờ:
  • models/book.rb
has_attached_file :image
  • Tạo Controller, Views, and Routes
  • books_controller.rb
class BooksController < ApplicationController
  before_action :set_book, only: [:show, :download]
 
  def index
    @books = Book.order('created_at DESC')
  end
 
  def new
    @book = Book.new
  end
 
  def show
  end
 
  def create
    @book = Book.new(book_params)
    if @book.save
      redirect_to books_path
    else
      render :new
    end
  end
 
  private
 
  def book_params
    params.require(:book).permit(:title, :description, :image, :author)
  end
 
  def set_book
    @book = Book.find(params[:id])
  end
end
  • views/books/index.html.erb
<h1>Bookshelf</h1>
 
<%= link_to 'Add book', new_book_path %>
<ul>
  <%= render @books %>
</ul>
  • views/books/_book.html.erb
<li>
  <strong><%= link_to book.title, book_path(book) %></strong> by <%= book.author %>
</li>
  • config/routes.rb
Rails.application.routes.draw do
resources :books
  root to: 'books#index'
end

2. Tải lên tập tin

  • views/books/new.html.erb
<h1>Add book</h1>
 
<%= render 'form', book: @book %>
  • views/books/_form.html.erb
<%= form_for book do |f| %>
  <div>
    <%= f.label :title %>
    <%= f.text_field :title %>
  </div>
 
  <div>
    <%= f.label :author %>
    <%= f.text_field :author %>
  </div>
 
  <div>
    <%= f.label :description %>
    <%= f.text_area :description %>
  </div>
 
  <div>
    <%= f.label :image %>
    <%= f.file_field :image %>
  </div>
 
  <%= f.submit %>
<% end %>

3. Thêm xác nhận (Validations)

Validations trong Paperclip có thể được viết bằng cách sử dụng các helper cũ như validates_attachment_presence và validates_attachment_content_type hoặc bằng cách sử dụng phương pháp validates_attachment để xác định nhiều quy tắc cùng một lúc. Chúng ta hãy sử dụng lựa chọn cuối: models/book.rb

validates_attachment :image,
                     content_type: { content_type: /Aimage/.*z/ },
                     size: { less_than: 1.megabyte }

Sau khi thêm validations, hãy cài đặt hiển thị thông báo lỗi trong mẫu của chúng ta:

  • views/shared/_errors.html.erb
<% if object.errors.any? %>
  <h3>Some errors were found:</h3>
  <ul>
    <% object.errors.full_messages.each do |message| %>
      <li><%= message %></li>
    <% end %>
  </ul>
<% end %>
  • views/books/_form.html.erb
<%= render 'shared/errors', object: book %>

4.Hiển thị hình ảnh

vậy bây giờ hình ảnh được tải lên sẽ được hiển thị bằng cách nào đó. Điều này được thực hiện bằng cách sử dụng helper image_tag và một phương pháp url. Tạo một view hiển thị:

  • views/books/show.html.erb
<h1><%= @book.title %> by <%= @book.author %></h1>
 
<%= image_tag(@book.image.url) if @book.image.exists? %>
 
<p><%= @book.description %></p>

Và như vậy bạn có thể tải ảnh lên với gem paperclip rồi đấy.

0