12/08/2018, 13:59

Product with multi image by gem Paperclip

1.Lời nói đầu Việc đăng nhiều ảnh của 1 sản phẩm lên 1 trang web bán hàng là rất thường gặp vì vậy viết bài này để hướng dẫn cho việc đó. 2. Sử dụng gem gem "paperclip" #bundle Tạo 2 model trong đó có 1 model products có 1 attr là name và 1 model product_images không có attr nào. ...

1.Lời nói đầu

Việc đăng nhiều ảnh của 1 sản phẩm lên 1 trang web bán hàng là rất thường gặp vì vậy viết bài này để hướng dẫn cho việc đó.

2. Sử dụng gem

gem "paperclip"
#bundle

Tạo 2 model trong đó có 1 model products có 1 attr là name và 1 model product_images không có attr nào.

rails g paperclip ProductImages image
rake db:migrate:reset

Lệnh rails g paperclip ProductImages image sẽ render ra 1 attr image cho model product_images

class Product < ApplicationRecord
  has_many :product_images, dependent: :destroy
  accepts_nested_attributes_for :product_images,
    reject_if: proc {|attributes| attributes["_destroy"] == "1"}
end

Tạo quan hệ nested attribute và validate cho image

class ProductImage < ApplicationRecord
  has_attached_file :image, styles: {medium: "300x300>", thumb: "100x100>"},
    default_url: "/images/:style/missing.png"
  validates_attachment_content_type :image, content_type: /Aimage/.*z/
end

Ok, tiếp theo chúng ta sẽ build form product với 1 vài product_images bằng nested attributes

#products_controller.rb
  def new
    *@product = Product.new
    *@product.product_images.build
  end
...
#_form.html.erb
<%= f.fields_for :product_images do |product_image_field| %>
  <%= render "product_image_field", f: product_image_field %>
<% end %>
<%= link_to_add_fields "Add other product images", f, :product_images %>
...
#_product_image_field
<%= f.label :image %>
<%= f.file_field :image %>
<%= link_to_remove_fields t(:remove), f %>

build xong form với nested attributes, ta sẽ tiếp tục các bước như nested attribute bình thường

def product_params
  params.require(:product).permit :name, product_images_attributes: [:id, :image, :_destroy]
end
  def create
    *@product = Product.new product_params
    if *@product.save
      flash[:success] = t "admin.add_success", source: "product"
      redirect_to admin_products_path
    else
      load_data
      render :new
    end
  end

Hiển thị toàn bộ ảnh của 1 product

<% *@product.product_images.each do |image| %>
  <%= image_tag image.image %>
<% end %>

3.Kết Luận

Đến đây, phần giới thiệu về gem Paperclip đã hết. Việc cài đặt cũng như sử dụng gem khá là đơn giản. Mong rằng sẽ giúp được các bạn trong project.

0