ruby-on-rails til - It costs 1 mins to read

Paperclip Fingerprint

Tình huống của hôm nay là Sếp bỗng dưng muốn chuyển tất cả assets của ứng dụng từ Amazon S3 về VCCloud CDN (đang khuyến mãi gói 100 GB miễn phí, giá tính ra không đắt hơn Amazon S3 nhiều lắm và được khoản Servers đặt ở Hà Nội - Đà Nẵng - Hồ Chí Minh nên thích hợp cho App có lượng lớn truy cập từ VN.)

Sử dụng CDN của VCCloud cũng đơn giản, chẳng phải setup nhiều, chỉ add domain của S3 Bucket vào là chạy được ngay (Enable Static Web Hosting cho Bucket S3 để có sub-domain riêng). Nhưng đẻ ra một vấn đề là trước đây, dùng Paperclip để upload users’s file lên S3 mà không có fingerprint, giờ mà dùng CDN thì hỏng bét, nếu file ở S3 có thay đổi thì CDN vẫn serve file cũ. »> Enable Fingerprint vào tên file cho Paperclip

1 . Tạo Migration cho tất cả các cột có sử dụng Paperclip handle attachment

class AddAvatarFingerPrintToUsers < ActiveRecord::Migration
  def change
    add_column :users, :avatar_fingerprint, :string
  end
end

2 . Thêm Fingerprint vào tên file (đây là ví dụ cho trường hợp của mình)

config/initializers/paperclip.rb

Paperclip::Attachment.default_options.merge! {
  :path => ":class/:attachment/:id_:style_:fingerprint.:extension"
}

Xong bước này thì tất cả file mới upload sau này đều có fingerprint.

3 . Xử lý file đã upload trước đây bằng cách chạy rake sau:

RAILS_ENV=production rake paperclip:refresh CLASS=model_name

3b . Nếu không muốn chạy Rake trên thì có thể xử lý thủ công bằng:

users_to_reprocess.each do |user|
  user.avatar.reprocess!
end

viphat@13-05-2016