RubyOnRails и Paperclip


Шпаргалка по использованию Paperclip (плагин для работы с изображениями) в проектах RubyOnRails.

Установка

Прежде всего необходимо установить библиотеку ImageMagic, которая используется Paperclip для масштабирования изображений:
sudo apt-get install libmagick9-dev
После чего устанавливаем Paperclip: прописываем в Gemfile "gem 'paperclip'" и выполняем bundle install.

Использование

Модель с одним изображением.

В качестве примера добавим аватар к модели User:
rails g paperclip User avatar
rake db:migrate
Открываем User.rb и пишем:
attr_accessible :avatar
has_attached_file :avatar,
:styles => { :small => '28x28#', :medium => '48x48#' }
Т.е. мы сделали аватар доступным для редактирования и задали два стиля: "small" и "medium".
Добавляем в форму редактирования профиля пользователя поле для выбора изображения:
<%= f.file_field :avatar %>
и - для отображения аватара пользователя - прописываем например в app/views/users/show.html.erb:
<%= image_tag @user.avatar.url("medium") %>

Модель с несколькими изображениями.

Теперь рассмотрим случай, когда у модели должно быть несколько изображений. Например, несколько фотографий товара (модель Product) в интернет-магазине.
Создаем модель Asset:
rails g model Asset product_id:integer
Редактируем файл миграции, добавляем индекс для связи с таблицей products:
def change
  create_table :assets do |t|
    t.integer :product_id
    t.timestamps
  end
  add_index :assets, :product_id
end
Запускаем миграцию, после чего выполняем:
rails g paperclip Asset image
снова запускаем миграцию и редактируем файл app/models/asset.rb. Добавляем:
belongs_to :product
has_attached_file :image,
      :styles => {:small => '64x64#', :medium => '260x310>'}
Редактируем файл app/models/product.rb:
has_many :assets, :dependent => :destroy
Реализуем возможность прикрепления нескольких изображений при редактировании товара. Дописываем в app/models/product.rb:
attr_accessible :assets_attributes
accepts_nested_attributes_for :assets, :allow_destroy => true
Редактируем app/controllers/products_controller.rb:
def new
  ...
 5.times {@product.assets.build}
end
т.е. при редактировании товара у нас будет возможность прикрепить пять новых изображений. Теперь вносим изменения в форму app/views/products/_form.html.erb:
# для добавления новых изображений
<%= f.fields_for :assets do |asset| %>
  <% if asset.object.new_record? %>
    <%= render "assets/form", :f => asset %>
 <% end %>
<% end %>
# для редактирования старых <%= f.fields_for :assets do |asset| %>
  <% unless asset.object.new_record? %>
    <%= link_to( image_tag(asset.object.image.url(:small)),
             asset.object.image.url(:original))%>
    <%= asset.check_box :_destroy %>
  <% end %>
<% end %>
Осталось только создать форму для Asset - app/views/assets/_form.html.erb:
<div class="controls">
  <%= f.file_field :image %>
</div>

Стили изображений

Стили изображений записываются в виде "WxHm", где W - ширина, H - высота, m - модификатор. Подробнее можно почитать здесь. Несколько примеров:

WxH - максимальный размер. Изображение масштабируется под данный размер с сохранением пропорций.

WxH! - точный размер без сохранения пропорций.

Wx - масштабирование с сохранением пропорций под ширину.

xH - масштабирование с сохранением пропорций под высоту.

WxH^ - минимальный размер.

WxH> - масштабировать только, если изображение больше указанного размера.

WxH< - масштабировать только, если изображение меньше указанного размера.

Обновление изображений

Итак, мы настроили стили, прикрепили к объектам изображения. Теперь внесем изменения в стили (добавим новые, или изменим пропорции) и отмасштабируем загруженные ранее картинки. Делается это просто. Заходим в консоль (rails c) и выполняем:
> User.find_each {|el| el.avatar.reprocess!}

Проверка на наличие изображения

И напоследок, проверим наличие аватара у пользователя:
<% if @user.avatar.exists? %>

Комментарии

Популярные сообщения из этого блога

Конвертируем Ruby-приложение в exe

JQuery и Rails - делаем кнопку "like it" со счетчиком

Резервное копирование базы данных по расписанию