RubyOnRails и Paperclip
Шпаргалка по использованию Paperclip (плагин для работы с изображениями) в проектах RubyOnRails.
Установка
Прежде всего необходимо установить библиотеку ImageMagic, которая используется Paperclip для масштабирования изображений:sudo apt-get install libmagick9-devПосле чего устанавливаем Paperclip: прописываем в Gemfile "gem 'paperclip'" и выполняем bundle install.
Использование
Модель с одним изображением.
В качестве примера добавим аватар к модели User:rails g paperclip User avatarОткрываем User.rb и пишем:
rake db:migrate
attr_accessible :avatarТ.е. мы сделали аватар доступным для редактирования и задали два стиля: "small" и "medium".
has_attached_file :avatar,:styles => { :small => '28x28#', :medium => '48x48#' }
Добавляем в форму редактирования профиля пользователя поле для выбора изображения:
<%= 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Редактируем файл app/models/product.rb:
has_attached_file :image,
:styles => {:small => '64x64#', :medium => '260x310>'}
has_many :assets, :dependent => :destroyРеализуем возможность прикрепления нескольких изображений при редактировании товара. Дописываем в app/models/product.rb:
attr_accessible :assets_attributesРедактируем app/controllers/products_controller.rb:
accepts_nested_attributes_for :assets, :allow_destroy => true
def newт.е. при редактировании товара у нас будет возможность прикрепить пять новых изображений. Теперь вносим изменения в форму app/views/products/_form.html.erb:
...
5.times {@product.assets.build}
end
# для добавления новых изображенийОсталось только создать форму для Asset - app/views/assets/_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 %>
<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? %>
Комментарии
Отправить комментарий