Tạo thumbnails với Carrierwave

Viết bởi Miha Filej, @mfilej

Coach: Giải thích những quy định cụ thể chiều rộng ảnh trong HTML ở cuối bước 4 và khác như thế nào so với trên server.

1. Cài đặt ImageMagick

Coach: ImageMagick là gì và khác với những libraries/gems mà chúng ta sử dụng trước đó như thế nào?

Mở Gemfile trong project và thêm:

gem 'mini_magick', '3.8.0'

ngay bên dưới dòng

gem 'carrierwave'

trong Terminal chạy:

bundle

và nhớ khởi động lại server

2. Tạo thumbnails khi ảnh đã được upload

Mở app/uploaders/picture_uploader.rb và tìm dòng:

# include CarrierWave::MiniMagick

bỏ dấu #

Coach: Giải thích khái niệm comment trong code

Phía dưới dòng mới thay đổi, thêm:

version :thumb do
  process :resize_to_fill => [50, 50]
end

Những hình ảnh tải lên từ bây giờ sẽ được thay đổi kích thước, nhưng những ảnh đã tải lên trước đó sẽ không được thay đổi. Chúng ta có thể sửa chúng bằng cách sửa idea và upload lại ảnh.

3. Hiện thị thumbnails

Để thấy được những ảnh đã tải lên được thay đổi kích thước, mở app/views/ideas/index.html.erb

Thay dòng

<%= image_tag idea.picture_url, width: '100%' if idea.picture.present? %>

thành

<%= image_tag idea.picture_url(:thumb) if idea.picture? %>

Ngay bây giờ, bạn hãy mở trình duyệt lên để thấy được thumbnail ảnh.

Những câu hỏi nâng cao

A Dễ

Hiện thị ảnh thumbnail trong trang app/views/ideas/show.html.erb

Mở tệp tin app/views/ideas/show.html.erb thay thế dòng sau
<%= image_tag(@idea.picture_url, width: '100%') if @idea.picture.present? %>
bằng dòng sau
<%= image_tag(@idea.picture_url(:thumb)) if @idea.picture.present? %>

B Bình thường

Định nghĩa thêm những version khác và sử dụng trong trang app/views/ideas/index.html.erb. Ví dụ: version :small_thumb, from_version: :thumb

Mở tệp tin app/uploaders/picture_uploader.rb thêm đoạn ngay bên dưới đoạn mã:
version :thumb do
  process :resize_to_fill => [50, 50]
end
với đoạn mã
version :small_thumb, from_version: :thumb do
  process resize_to_fill: [20, 20]
end
Sửa dòng sau trong app/views/ideas/index.html.erb
<%= image_tag idea.picture_url(:thumb) if idea.picture? %>
bằng dòng
<%= image_tag(idea.picture_url(:small_thumb)) if idea.picture.present? %>

C Khó

Lưu trữ ảnh trên dịch vụ cloudinary.com sử dụng carrierwave và hiện thị lên trình duyệt trong trang app/views/ideas/index.html.erb.

Đăng ký một tài khoản trên website cloudinary.com. Sau khi đăng ký, thực hiện đăng nhập, tải file cấu hình tại đây và lưu vào thư mục config. Chúng ta sẽ có tệp tin cấu hình theo đường dẫn
config/cloudinary.yml
Mở tệp tin Gemfile thêm gem "cloudinary" ngay bên dưới gem "carrierwave":
gem "carrierwave"
gem "cloudinary"
Sau đó thực hiện cài đặt gem mới bằng lệnh:
bundle install
Mở tệp tin uploaders/picture_uploader.rb, comment các đoạn mã giống như sau:
...
# include CarrierWave::MiniMagick
...
# storage :file
...
# def store_dir
#   "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
# end
Ngay bên dưới dòng:
class PictureUploader < CarrierWave::Uploader::Base
thêm dòng sau
include Cloudinary::CarrierWave
Vậy là xong, bây giờ bạn khởi động lại server và thử tải ảnh mới của một `Idea` và kiểm tra trong trang `/ideas/index` xem nhé.