Скрепка устарела .
Для новых проектов мы рекомендуем собственный ActiveStorage от Rails.
Для существующих проектов, пожалуйста, ознакомьтесь и внесите свой вклад в руководство по миграции, доступное на английском и испанском языках, а также в виде видео, записанного на RailsConf 2019. Вы также можете предпочесть альтернативное руководство по миграции, используемое Doorkeeper.
В качестве альтернативы для существующих проектов Kreeti поддерживает kt-paperclip, продолжающуюся версию Paperclip.
Мы оставим Вопросы открытыми только в качестве дискуссионного форума. Мы не гарантируем ответ от нас в Вопросах. Все отчеты об ошибках следует отправлять в kt-paperclip.
Мы больше не принимаем запросы на включение, за исключением запросов на включение в соответствии с руководством по миграции. Все остальные запросы на включение будут закрыты без слияния.
master
веткиПожалуйста, проверьте документацию для используемой вами версии скрепки: https://github.com/ Thoughtbot/paperclip/releases.
Требования
Руби и рельсы
Процессор изображений
file
Установка
Быстрый старт
Модели
Миграции
Редактирование и новые представления
Редактирование и создание новых представлений с помощью простой формы
Контроллер
Просмотр помощников
Проверка существования файла
Удаление вложения
Использование
Валидации
Интернационализация (I18n)
Проверки безопасности
По умолчанию
Миграции
Добавить столбец вложения в таблицу
Определение схемы
Винтажный синтаксис
Хранилище
Понимание хранилища
Адаптеры ввода-вывода
Постобработка
Пользовательские процессоры вложений
События
Обфускация URI
Контрольная сумма/отпечаток пальца
Сохранение файлов для обратимого удаления
Динамическая конфигурация
Динамические стили:
Динамические процессоры:
Ведение журнала
Развертывание
Стили прикрепления
Тестирование
Содействие
Лицензия
О мыслеботе
Paperclip задуман как простая библиотека вложения файлов для ActiveRecord. Цель заключалась в том, чтобы максимально упростить настройку и обращаться с файлами как с другими атрибутами, насколько это возможно. Это означает, что они не сохраняются в своих конечных местах на диске и не удаляются, если для них задано значение nil, до тех пор, пока не будет вызван ActiveRecord::Base#save. При необходимости он управляет проверками на основе размера и присутствия. При необходимости он может преобразовать назначенное ему изображение в миниатюры, а предварительные требования так же просты, как установка ImageMagick (что для большинства современных систем на базе Unix так же просто, как установка правильных пакетов). Прикрепленные файлы сохраняются в файловой системе и на них ссылаются в браузере с помощью понятной спецификации, которая имеет разумные и полезные настройки по умолчанию.
См. документацию по has_attached_file
в Paperclip::ClassMethods
для получения более подробной информации.
Полный RDoc доступен онлайн.
Paperclip теперь требует Ruby версии >= 2.1 и Rails версии >= 4.2 (только если вы собираетесь использовать Paperclip с Ruby on Rails).
ImageMagick должен быть установлен, и Paperclip должен иметь к нему доступ. Чтобы убедиться в этом, в командной строке запустите which convert
(одну из утилит ImageMagick). Это даст вам путь, по которому установлена эта утилита. Например, он может вернуть /usr/local/bin/convert
.
Затем в файле конфигурации вашей среды сообщите Paperclip, что нужно поискать его, добавив этот каталог в его путь.
В режиме разработки вы можете добавить эту строку в config/environments/development.rb)
:
Paperclip.options[:command_path] = "/usr/local/bin/"
Если вы используете Mac OS X, вам нужно запустить с помощью Homebrew следующее:
brew install imagemagick
Если вы имеете дело с загрузкой PDF-файлов или запуском набора тестов, вам также потребуется установить GhostScript. В Mac OS X вы также можете установить его с помощью Homebrew:
brew install gs
Если вы используете Ubuntu (или любой другой дистрибутив Linux на базе Debian), вам нужно запустить с помощью apt-get следующее:
sudo apt-get install imagemagick -y
file
Команда Unix file
необходима для проверки типа содержимого. Эта утилита недоступна в Windows, но поставляется в комплекте с Ruby Devkit, поэтому пользователи Windows должны убедиться, что пакет разработчика установлен и добавлен в системную переменную PATH
.
Ручная установка
Если вы используете Windows 7+ в качестве среды разработки, вам может потребоваться установить приложение file.exe
вручную. На этом основана система file spoofing
в Paperclip 4+; если он у вас не работает, вы получите Validation failed: Upload file has an extension that does not match its contents.
ошибки.
Для установки вручную необходимо выполнить следующее:
Загрузите и установите
file
с этого URL
Для проверки вы можете использовать изображение ниже:
Далее вам необходимо интегрироваться с вашей средой — желательно через переменную PATH
или изменив файл config/environments/development.rb
ПУТЬ
1. Click "Start" 2. On "Computer", right-click and select "Properties" 3. In Properties, select "Advanced System Settings" 4. Click the "Environment Variables" button 5. Locate the "PATH" var - at the end, add the path to your newly installed `file.exe` (typically `C:Program Files (x86)GnuWin32bin`) 6. Restart any CMD shells you have open & see if it works
ИЛИ
Среда
1. Open `config/environments/development.rb` 2. Add the following line: `Paperclip.options[:command_path] = 'C:Program Files (x86)GnuWin32bin'` 3. Restart your Rails server
Любой из этих методов предоставит вашей установке Rails доступ к функциональности file.exe
, тем самым предоставляя возможность проверять содержимое файла (решая проблему подмены)
Скрепка распространяется как драгоценный камень, и именно так ее следует использовать в вашем приложении.
Включите драгоценный камень в свой Gemfile:
драгоценный камень "скрепка", "~> 6.0.0"
Или, если вы хотите получить последнюю версию, вы можете получить мастер из основного репозитория скрепок:
драгоценный камень "скрепка", git: "git://github.com/ Thoughtbot/paperclip.git"
Если вы пытаетесь использовать функции, которых нет в последнем выпущенном драгоценном файле, но которые упомянуты в этом README, вам, вероятно, придется указать главную ветку, если вы хотите их использовать. Этот README, вероятно, опережает последнюю выпущенную версию, если вы читаете ее на GitHub.
Для использования без Rails:
class ModuleName < ActiveRecord::Base включает Paperclip::Glue ...конец
class User < ActiveRecord::Base has_attached_file: аватар, стили: { средний: "300x300>", Thumb: "100x100>" }, default_url: "/images/:style/missing.png" validates_attachment_content_type :avatar, content_type: / Изображение/.*z/end
Предполагая, что у вас есть таблица users
, добавьте столбец avatar
в таблицу users
:
class AddAvatarColumnsToUsers < ActiveRecord::Migration def up add_attachment :users, :avatar end def down remove_attachment :users, :avatar endend
(Или вы можете использовать генератор миграции Rails: rails generate paperclip user avatar
)
Убедитесь, что в вашем контроллере есть соответствующие методы:
<%= form_for @user, url: user_path, html: { multipart: true } do |form| %> <%= form.file_field :avatar %> <%= form.submit %><% end %>
<%= simple_form_for @user, url: user_path do |form| %> <%= form.input :avatar, as: :file %> <%= form.submit %><% end %>
def create @user = User.create(user_params)endprivate# Используйте Strong_parameters для внесения в белый список атрибутов# Обязательно обновите методы контроллера create() и update().def user_params params.require(:user).permit(:avatar)end
Добавьте их в представление, в котором вы хотите отображать изображения:
<%= image_tag @user.avatar.url %><%= image_tag @user.avatar.url(:medium) %><%= image_tag @user.avatar.url(:thumb) %>
Существует два метода проверки существования файла:
file?
и present?
проверяет, заполнено ли поле _file_name
exists?
проверяет, существует ли файл (будет выполнять TCP-соединение, если он хранится в облаке)
Имейте это в виду, если проверяете наличие файлов в цикле. Первая версия значительно более производительна, но имеет другую семантику.
Установите атрибут равным nil
и сохраните.
@user.avatar = [email protected]
Основы Paperclip довольно просты: объявите, что ваша модель имеет вложение с помощью метода has_attached_file
, и дайте ему имя.
Paperclip обернет до четырех атрибутов (все с префиксом имени этого вложения, так что вы можете иметь несколько вложений для каждой модели, если хотите) и предоставит им дружественный интерфейс. Эти атрибуты:
По умолчанию для работы Paperclip требуется только
. Вам нужно будет добавить
, если вы хотите использовать проверку типа контента.
Дополнительную информацию о параметрах, передаваемых в has_attached_file
можно найти в документации Paperclip::ClassMethods
.
Для проверок Paperclip предлагает несколько валидаторов для проверки вашего вложения:
AttachmentContentTypeValidator
AttachmentPresenceValidator
AttachmentSizeValidator
Пример использования:
проверяет :avatar, Attachment_presence: truevalidates_with AttachmentPresenceValidator, атрибуты: :avatarvalidates_with AttachmentSizeValidator, атрибуты: :avatar, less_than: 1.megabytes
Валидаторы также можно определить, используя старый вспомогательный стиль:
validates_attachment_presence
validates_attachment_content_type
validates_attachment_size
Пример использования:
validates_attachment_presence: аватар
Наконец, вы также можете определить несколько проверок для одного вложения, используя validates_attachment
:
validates_attachment: аватар, присутствие: true, content_type: «image/jpeg», размер: {в: 0..10 килобайт }
ПРИМЕЧАНИЕ. Постобработка даже не начнется , если вложение недействительно в соответствии с проверками. Ваши обратные вызовы и процессоры будут вызываться только с действительными вложениями.
class Message < ActiveRecord::Base has_attached_file :asset,styles: {thumb: "100x100#" } before_post_process :skip_for_audio defskip_for_audio ! %w(audio/ogg application/ogg).include?(asset_content_type) endend
Если у вас есть другие проверки, которые зависят от порядка назначения, рекомендуемый порядок действий — предотвратить назначение вложения до тех пор, пока это не произойдет, а затем назначить вручную:
class Book < ActiveRecord::Base has_attached_file :document, Styles: { миниатюра: "60x60#" } validates_attachment :document, content_type: "application/pdf" validates_something_else # Другие проверки, конфликтующие с Paperclip'sendclass BooksController < ApplicationController def create @book = Book.new(book_params) @book.document = params[:book][:document] @book.save response_with @book end Private def book_params params.require(:book).permit(:title, :author) endend
Примечание о проверках и безопасности content_type
Вы должны убедиться, что вы проверяете файлы только на те типы MIME, которые вы явно хотите поддерживать. В противном случае вы можете подвергнуться XSS-атакам, если пользователь загрузит файл с вредоносной полезной нагрузкой HTML.
Если вас интересуют только изображения, ограничьте разрешенные типы контента изображениями:
validates_attachment :avatar, content_type: ["изображение/jpeg", "изображение/gif", "изображение/png"]
Paperclip::ContentTypeDetector
попытается сопоставить расширение файла с предполагаемым типом содержимого, независимо от фактического содержимого файла.
Чтобы использовать или добавлять файлы локали на разных языках, проверьте проект https://github.com/ Thoughtbot/paperclip-i18n.
Благодаря отчету Егора Хомакова мы предприняли шаги, чтобы не допустить подмены типов контента и попадания на ваш сервер данных, которых вы не ожидали.
ПРИМЕЧАНИЕ. Начиная с версии 4.0.0, все вложения должны включать проверку типа содержимого, проверку имени файла или явно указывать, что они не будут иметь ни того, ни другого. Если вы этого не сделаете , Paperclip выдаст ошибку .
class ActiveRecord::Base has_attached_file :avatar # Проверка типа контента validates_attachment_content_type :avatar, content_type: /Aimage/ # Проверка имени файла validates_attachment_file_name :avatar, match: [/pngz/, /jpe?gz/] # Явно не делайте этого проверить do_not_validate_attachment_file_type :аватаренд
Это обеспечивает безопасность Paperclip по умолчанию и предотвратит попытки людей взломать вашу файловую систему.
ПРИМЕЧАНИЕ. Начиная с версии 4.0.0, Paperclip имеет еще одну проверку, которую нельзя отключить. Эта проверка предотвратит подмену типа контента. То есть загрузка PHP-документа (например) как части EXIF-тегов правильно сформированного JPEG. Эта проверка ограничена типом носителя (первая часть типа MIME, т. е. «текст» в text/plain
). Это предотвратит загрузку HTML-документов в формате JPEG, но не помешает загрузке GIF-файлов с расширением .jpg
. Эта проверка добавит в форму только ошибки проверки. Это не приведет к возникновению ошибок.
Иногда это может вызывать ложные ошибки проверки в приложениях, использующих собственные расширения файлов. В этих случаях вы можете добавить свое собственное расширение в список сопоставлений типов контента, создав config/initializers/paperclip.rb
:
# Разрешить расширение ".foo" для файлов с MIME-типом "text/plain".Paperclip.options[:content_type_mappings] = { foo: %w(text/plain)}
Глобальные настройки по умолчанию для всех вложений Paperclip можно определить, изменив хеш Paperclip::Attachment.default_options. Это может быть полезно для установки настроек хранилища по умолчанию для каждого примера, поэтому вам не придется определять их в каждом определении has_attached_file
.
Если вы используете Rails, вы можете определить хеш с параметрами по умолчанию в config/application.rb
или в любом из файлов config/environments/*.rb
в config.paperclip_defaults. Они будут объединены в Paperclip::Attachment.default_options
при загрузке вашего приложения Rails. Пример:
модуль YourApp class Application < Rails::Application # Другой код... config.paperclip_defaults = { Storage: :fog, Fog_credentials: {Provider: "Local", local_root: "#{Rails.root}/public"}, Fog_directory: "", туман_хост: "localhost"} конец
Другой вариант — напрямую изменить хеш Paperclip::Attachment.default_options
— этот метод работает для приложений, отличных от Rails, или является вариантом, если вы предпочитаете поместить настройки Paperclip по умолчанию в инициализатор.
Пример инициализатора Rails будет выглядеть примерно так:
Скрепка::Attachment.default_options[:storage] = :fogPaperclip::Attachment.default_options[:fog_credentials] = { поставщик: "Local", local_root: "#{Rails.root}/public"}Скрепка::Attachment.default_options[ :fog_directory] = ""Скрепка::Attachment.default_options[:fog_host] = "http://localhost:3000"
Paperclip определяет несколько методов миграции, которые можно использовать для создания необходимых столбцов в вашей модели. В этом помогут два типа вспомогательных методов:
Помощник attachment
можно использовать при создании таблицы:
класс CreateUsersWithAttachments < ActiveRecord::Migration def up create_table :users do |t| t.attachment :avatar end end # Предполагается, что вы используете таблицу пользователей только для прикрепления скрепки. Сбрасывайте осторожно! def down drop_table :users endend
Вы также можете использовать метод change
вместо приведенной выше комбинации up
/ down
, как показано ниже:
класс CreateUsersWithAttachments < ActiveRecord::Migration def изменить create_table :users do |t| t.attachment :аватар конец конец
Альтернативно, методы add_attachment
и remove_attachment
можно использовать для добавления новых столбцов Paperclip в существующую таблицу:
class AddAttachmentColumnsToUsers < ActiveRecord::Migration def up add_attachment :users, :avatar end def down remove_attachment :users, :avatar endend
Или вы можете сделать это с помощью метода change
:
класс AddAttachmentColumnsToUsers < ActiveRecord::Migration def изменение add_attachment :users, :avatar endend
Винтажный синтаксис (например, t.has_attached_file
и drop_attached_file
) по-прежнему поддерживается в Paperclip 3.x, но рекомендуется обновить эти файлы миграции, чтобы использовать этот новый синтаксис.
В комплект поставки скрепки входят 3 адаптера для хранения:
Хранение файлов
Хранилище S3 (через aws-sdk-s3
)
Хранение тумана
Если вы хотите использовать Paperclip с другим хранилищем, вы можете установить эти драгоценные камни вместе с Paperclip:
скрепка-лазурь
скрепка-лазурь-хранилище
скрепка-дропбокс
Файлы, назначенные в качестве вложений, по умолчанию помещаются в каталог, указанный опцией :path
для has_attached_file
. По умолчанию это местоположение :rails_root/public/system/:class/:attachment/:id_partition/:style/:filename
. Это расположение было выбрано потому, что в стандартных развертываниях Capistrano public/system
каталог может быть связан с общим каталогом приложения, что означает, что он сохраняется между развертываниями. Например, используя этот :path
, вы можете иметь файл по адресу
/data/myapp/releases/20081229172410/public/system/users/avatar/000/000/013/small/my_pic.png
ПРИМЕЧАНИЕ . Это отличие от предыдущих версий Paperclip, но в целом это более безопасный выбор для хранилища файлов по умолчанию.
Вы также можете хранить свои файлы с помощью сервиса Amazon S3. Для этого включите гем aws-sdk-s3
в свой Gemfile:
драгоценный камень 'aws-sdk-s3'
И затем вы можете указать, используя S3 из has_attached_file
. Дополнительную информацию о настройке и использовании хранилища S3 можно найти в документации Paperclip::Storage::S3
.
Файлы в локальной файловой системе (и в общедоступном каталоге приложения Rails) будут доступны в Интернете в целом. Если вам требуется контроль доступа, вы можете разместить файлы в другом месте. Вам нужно будет изменить параметры :path
и :url
, чтобы файлы были недоступны для общественности. И :path
, и :url
допускают один и тот же набор интерполируемых переменных.
Когда файл загружается или прикрепляется, он может иметь одну из нескольких различных форм ввода: от объекта Rails UploadedFile до StringIO, Tempfile или даже простой строки, которая представляет собой URL-адрес, указывающий на изображение.
Paperclip по умолчанию принимает многие из этих источников. Он также способен обрабатывать еще больше при небольшой настройке. Адаптеры ввода-вывода, обрабатывающие изображения из нелокальных источников, по умолчанию не включены. Их можно включить, добавив в config/initializers/paperclip.rb
строку, подобную следующей:
Скрепка::DataUriAdapter.register
Лучше всего включать адаптер удаленной загрузки только в том случае, если он вам нужен. В противном случае есть шанс, что кто-то сможет получить представление о вашей внутренней сетевой структуре, используя ее в качестве вектора.
Следующие адаптеры не загружаются по умолчанию:
Paperclip::UriAdapter
— который принимает экземпляр URI
.
Paperclip::HttpUrlProxyAdapter
— принимает строку http
.
Paperclip::DataUriAdapter
— который принимает строку data:
в кодировке Base64.
Paperclip поддерживает расширяемый набор постпроцессоров. Когда вы определяете набор стилей для вложения, по умолчанию предполагается, что эти «стили» на самом деле являются «миниатюрами». Они обрабатываются Paperclip::Thumbnail
. По соображениям обратной совместимости вы можете передать либо одну строку геометрии, либо массив, содержащий геометрию и формат, в который будет преобразован файл, например:
has_attached_file :avatar,styles: {thumb: ["32x32#", :png] }
Это преобразует стиль «большой палец» в квадрат 32x32 в формате PNG, независимо от того, что было загружено. Если формат не указан, он остается прежним (например, файлы JPG останутся файлами JPG). Paperclip::Thumbnail
использует ImageMagick для обработки изображений; Документация по геометрии ImageMagick содержит дополнительную информацию о принятых форматах стилей.
Для более детального управления процессом преобразования можно использовать source_file_options
и convert_options
для передачи флагов и настроек непосредственно в мощный инструмент преобразования ImageMagick, описанный здесь. Например:
has_attached_file :image, Styles: { Regular: ['800x800>', :png]}, source_file_options: {обычный: "-плотность 96 -глубина 8 -качество 85" }, Convert_options: {обычный: "-posterize 3"}
ImageMagick поддерживает ряд переменных среды для управления ограничениями ресурсов. Например, вы можете установить ограничения на память или время выполнения, установив следующие переменные в среде процесса вашего приложения:
MAGICK_MEMORY_LIMIT=128MiB
MAGICK_MAP_LIMIT=64MiB
MAGICK_TIME_LIMIT=30
Полный список переменных и описание см. в документации по ресурсам ImageMagick.
Вы можете написать свои собственные обработчики вложений для выполнения таких задач, как добавление водяных знаков, сжатие изображений или шифрование файлов. Пользовательские процессоры должны быть определены в модуле Paperclip
, наследоваться от Paperclip::Processor
(см. lib/paperclip/processor.rb
) и реализовать метод make
, который возвращает File
. Все файлы в каталогах lib/paperclip
и lib/paperclip_processors
вашего приложения Rails будут автоматически загружены Paperclip. Процессоры указываются с помощью опции :processors
для has_attached_file
:
has_attached_file :scan, стили: {текст: {качество: :лучше } }, процессоры: [:ocr]
Это позволит загрузить гипотетический класс Paperclip::Ocr
и передать ему параметры hash { quality: :better }
вместе с загруженным файлом.
Можно указать несколько процессоров, и они будут вызываться в том порядке, в котором они определены в массиве :processors
. Каждый последующий процессор получает результат предыдущего процессора. Все процессоры получают одни и те же параметры, определенные в хеше :styles
. Например, предположим, что у нас есть такое определение:
has_attached_file :scan, стили: {текст: {качество: :better } }, процессоры: [:rotator, :ocr]
И процессор :rotator
, и процессор :ocr
получат опции { quality: :better }
. Если процессор получает опцию, которую он не распознает, ожидается, что он проигнорирует ее.
ПРИМЕЧАНИЕ. Поскольку процессоры работают путем преобразования исходного вложения в стили, процессоры не будут запущены, если стили не определены.
Если вы заинтересованы в кэшировании ширины, высоты и размера миниатюры в базе данных, взгляните на мета-гем paperclip-meta.
Кроме того, если вы заинтересованы в создании миниатюры «на лету», вы можете изучить драгоценный камень Attachment_on_the_fly.
Генератор миниатюр Paperclip (см. lib/paperclip/thumbnail.rb
) реализован в виде процессора и может быть хорошим справочником для написания собственных процессоров.
До и после этапа постобработки Paperclip выполняет обратный вызов модели с помощью нескольких обратных вызовов, позволяя модели изменить или отменить этап обработки. Обратные вызовы — это before_post_process
и after_post_process
(которые вызываются до и после обработки каждого вложения), а также специфичные для вложения before_
и after_
. Обратные вызовы должны быть как можно ближе к обычным обратным вызовам ActiveRecord, поэтому, если вы вернете false (в частности, возврат nil не является тем же самым) в before_filter
, этап постобработки будет остановлен. Возврат false в after_filter
ничего не остановит, но при необходимости вы можете получить доступ к модели и вложению.
ПРИМЕЧАНИЕ. Постобработка даже не начнется , если вложение недействительно в соответствии с проверками. Ваши обратные вызовы и процессоры будут вызываться только с действительными вложениями.
class Message < ActiveRecord::Base has_attached_file :asset,styles: {thumb: "100x100#" } before_post_process :skip_for_audio defskip_for_audio ! %w(audio/ogg application/ogg).include?(asset_content_type) endend
Paperclip имеет интерполяцию под названием :hash
для запутывания имен общедоступных файлов.
Пример использования:
has_attached_file :avatar, { url: "/system/:hash.:extension", hash_secret: "longSecretString"}
Интерполяция :hash
будет заменена уникальным хешем, состоящим из всего, что указано в :hash_data
. Значением по умолчанию для :hash_data
является ":class/:attachment/:id/:style/:updated_at"
.
Требуется :hash_secret
— исключение будет выдано, если :hash
используется без присутствия :hash_secret
.
Подробнее об этой функции читайте в объяснении автора.
Контрольная сумма назначенного исходного файла будет помещена в модель, если он имеет атрибут с именем «отпечаток пальца». Следуя приведенному выше примеру миграции модели пользователя, миграция будет выглядеть следующим образом:
class AddAvatarFingerprintColumnToUser < ActiveRecord::Migration def up add_column :users, :avatar_fingerprint, :string end def down remove_column :users, :avatar_fingerprint endend
Алгоритм можно указать с помощью параметра конфигурации; по умолчанию используется MD5 для обратной совместимости с Paperclip 5 и более ранними версиями.
has_attached_file:some_attachment, адаптер_опции: { hash_digest: Digest::SHA256 }
Запустите CLASS=User ATTACHMENT=avatar rake paperclip:refresh:fingerprints
после изменения дайджеста существующих вложений, чтобы обновить отпечатки пальцев в базе данных.
Доступна опция сохранения вложений, чтобы можно было удобно работать с обратимо удаленными моделями. (действия_as_paranoid, паранойя и т. д.)
has_attached_file:some_attachment, {server_files: true,}
Это предотвратит удаление some_attachment
при уничтожении модели, поэтому он все равно будет существовать, когда объект будет восстановлен позже.
Вызываемые объекты (лямбда-выражения, Procs) можно использовать в различных местах для динамической настройки Paperclip. Эта стратегия существует в ряде компонентов библиотеки, но наиболее важна возможность применения пользовательских стилей и процессоров для конкретных экземпляров модели, а не применения определенных стилей и процессоров ко всем экземплярам.
Представьте себе модель пользователя, которая имеет разные стили в зависимости от роли пользователя. Возможно, некоторые пользователи являются начальниками (например, экземпляр модели User реагирует на #boss?
) и заслуживают большего размера миниатюры аватара, чем обычные пользователи. Конфигурация для определения того, какие параметры стиля следует использовать в зависимости от роли пользователя, может выглядеть следующим образом: начальник получит миниатюру 300x300
в противном случае будет создана миниатюра 100x100
.
класс User < ActiveRecord::Base has_attached_file: аватар, стили: лямбда { |attachment| { большой палец: (attachment.instance.boss? ? "300x300>" : "100x100>") } } end
Другим надуманным примером является пользовательская модель, которая знает, какие файловые процессоры следует к ней применить (помимо подразумеваемого процессора thumbnail
, вызываемого при определении :styles
). Возможно, у нас есть процессор водяных знаков, и он используется только на аватарах определенных моделей. Конфигурация для этого может заключаться в том, что у экземпляра запрашивается, какие процессоры следует к нему применить. Предположительно, некоторые пользователи могут возвращать [:thumbnail, :watermark]
для своих процессоров, где определенный процессор watermark
вызывается после процессора thumbnail
, уже определенного Paperclip.
класс User < ActiveRecord::Base has_attached_file :avatar, процессоры: лямбда { |instance| экземпляр.процессоры } attr_accessor:processorsend
По умолчанию Paperclip выводит журналы в соответствии с вашим уровнем журнала. Если вы хотите отключить ведение журнала (например, во время тестирования), добавьте это в конфигурацию вашей среды:
Ваш::Application.configure do... Paperclip.options[:log] = false...end
Дополнительная информация в документации
Чтобы сделать символическую ссылку Capistrano на public/system
каталог, чтобы вложения сохранялись при новых развертываниях, установите параметр linked_dirs
в файле config/deploy.rb
:
set :linked_dirs, fetch(:linked_dirs, []).push('public/system')
Paperclip знает о новых стилях прикрепления, которые вы добавили в предыдущих развертываниях. Единственное, что вам следует делать после каждого развертывания, — это вызывать rake paperclip:refresh:missing_styles
. По умолчанию текущие стили вложений будут храниться в RAILS_ROOT/public/system/paperclip_attachments.yml
. Вы можете изменить его:
Paperclip.registered_attachments_styles_path = '/tmp/config/paperclip_attachments.yml'
Вот пример для Капистрано:
пространство имен :paperclip do desc задача "создать недостающие стили скрепок" :build_missing_styles выполнить в roles(:app) выполнить в Release_path сделать с рельсами_env: fetch(:rails_env) выполнить выполнить :rake, "paperclip:refresh:missing_styles" end end end endendafter( "deploy:compile_assets", "скрепка:build_missing_styles")
Теперь вам не нужно обновлять миниатюры в рабочей среде каждый раз, когда вы добавляете новый стиль. К сожалению, он не работает с динамическими стилями — просто игнорирует их.
Если у вас уже есть работающее приложение и вы не хотите, чтобы rake paperclip:refresh:missing_styles
обновлял старые изображения, вам нужно сообщить Paperclip о существующих стилях. Просто создайте файл paperclip_attachments.yml
вручную. Например:
class User < ActiveRecord::Base has_attached_file :avatar, Styles: { Thumb: 'x100', Croppable: '600x600>', big: '1000x1000>' }endclass Book < ActiveRecord::Base has_attached_file :cover, Styles: { small: 'x100', большой: '1000x1000>' } has_attached_file: образец, стили: { большой палец: 'x100' } конец
Затем в RAILS_ROOT/public/system/paperclip_attachments.yml
:
---:Пользователь: :аватар: - :большой палец - :обрезаемый - :big:Книга: :cover: - :маленький - :большой :образец: - :большой палец
Paperclip предоставляет совместимые с rspec средства сопоставления для тестирования вложений. Дополнительную информацию смотрите в документации по Paperclip::Shoulda::Matchers.
Параллельные тесты
Из-за path
по умолчанию для хранилища Paperclip, если вы попытаетесь запустить тесты параллельно, вы можете обнаружить, что файлы перезаписываются, поскольку в каждом процессе тестирования для них рассчитывается один и тот же путь. Хотя это исправление работает для Parallel_tests, аналогичную концепцию следует использовать для любого другого механизма одновременного запуска тестов.
if ENV['PARALLEL_TEST_GROUPS'] Paperclip::Attachment.default_options[:path] = ":rails_root/public/system/:rails_env/#{ENV['TEST_ENV_NUMBER'].to_i}/:class/:attachment/:id_partition/ :имя_файла"еще Скрепка::Attachment.default_options[:path] = ":rails_root/public/system/:rails_env/:class/:attachment/:id_partition/:filename"end
Важной частью здесь является включение ENV['TEST_ENV_NUMBER']
или аналогичного механизма для любой библиотеки параллельного тестирования, которую вы используете.
Интеграционные тесты
Использование интеграционных тестов с FactoryBot может сохранить несколько копий ваших тестовых файлов в приложении. Чтобы избежать этого, укажите собственный путь в файле config/environments/test.rb
например:
Скрепка::Attachment.default_options[:path] = "#{Rails.root}/spec/test_files/:class/:id_partition/:style.:extension"
Затем обязательно удалите этот каталог после запуска набора тестов, добавив его в spec_helper.rb
.
config.after(:suite) do FileUtils.rm_rf(Dir["#{Rails.root}/spec/test_files/"])end
Пример тестовой конфигурации с Factory Bot
FactoryBot.define do Factory :user do avatar { File.new("#{Rails.root}/spec/support/fixtures/image.jpg") } endend
Если вы хотите добавить функцию или исправить ошибку: Спасибо! Чтобы обеспечить высокую вероятность включения вашего исправления/функции, прочтите следующие рекомендации:
Опубликуйте запрос на вытягивание.
Убедитесь, что есть тесты! Мы не принимаем непроверенные патчи. Это редкий случай, когда явные тесты не нужны. Если у вас есть вопросы по написанию тестов для скрепки, откройте проблему на GitHub.
Пожалуйста, посетите CONTRIBUTING.md
для получения более подробной информации о участии и проведении тестов.
Спасибо всем участникам!
Скрепка защищена авторскими правами © Thoughtbot, Inc., 2008-2017. Это бесплатное программное обеспечение, которое может распространяться на условиях, указанных в файле MIT-LICENSE.
Paperclip поддерживается и финансируется thinkbot. Названия и логотипы Thoughtbot являются торговыми марками Thoughtbot, Inc.
Мы любим программное обеспечение с открытым исходным кодом! Посмотрите другие наши проекты или наймите нас для проектирования, разработки и развития вашего продукта.