Как стать автором
Обновить

Множественная загрузка изображений при помощи Paperclip

В этом посте я хотел бы рассказать как при помощи Paperclip не прибегая к другим гемам сделать множественную загрузку. Мы будем использовать конечно же Ruby on Rails.

Примечание: в тексте будет встречаться advert это модель, название которой вы должны заменить на свою модель.

Для начала,
rails g model AttachedAsset


Миграция


Дальше прописываем столбики в миграции
class CreateAttachedAssets < ActiveRecord::Migration
  def change
    create_table :attached_assets do |t|
    	t.attachment :asset
    	t.integer :attachable_id
    	t.integer :attachable_type
    end
  end
end


Модели


Код модели прикрепляемого изображения
class AttachedAsset < ActiveRecord::Base
  belongs_to :attachable, :polymorphic => true
  has_attached_file :asset, :styles => { :mini => "260x180#", :normal => "800x400#" }
  attr_accessible :asset, :asset_file_name
end

В модели в которой будут содержатся изображения в attr_accesible прописываем
attr_accessible :attached_assets_attributes

Также добавим связь с моделью изображения и строку для того что-бы сделать мультимодельную форму
has_many :attached_assets, :as => :attachable
accepts_nested_attributes_for :attached_assets, :allow_destroy => true


Форма


Теперь разберемся с формой, как собственно добавлять и удалять изображения.
В form_for прописываем :multipart => true
<%= form_for @advert, :html => { :multipart => true } do |f| %>

И саму кнопку загрузки, не забудьте вместо advert написать название своей модели, с которой связывали attached_asset
<%= file_field_tag('advert_attached_assets_asset', multiple: true, name: "advert[attached_assets_attributes][][asset]") %>


Контроллер


В контроллере пропишем сохранение данных в БД
def create
  advert = Advert.new(params[:advert])
  advert.save
end

И удаление изображения
def delete_asset
  ad = Advert.find(params[:advert_id])
  asset = ad.attached_assets.find(params[:id])
  asset.asset.clear
  asset.destroy
  ad.save
  redirect_to :back
end


View


И во вьюхе выведем свои изображения, которые загрузили
<% @advert.attached_assets.each do |a| %>
  <%= image_tag(a.asset.url(:normal)) %>
<% end %>

А в редактировании пропишем вывод изображений и их удаление
<% @advert.attached_assets.each do |a| %>
  <%= image_tag(a.asset.url(:mini)) %>
  <%= link_to "Удалить", advert_delete_asset_path(advert_id: a.attachable_id, id: a.id) %>
<% end %>


Роуты


resources :adverts do
  get 'delete_asset' => "adverts#delete_asset"
end


Вывод


Когда мне понадобилось сделать загрузку нескольких фото, я мучался пол дня что-бы найти решение. Надеюсь вы затратите намного меньше времени для того что-бы это сделать.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.