jQuery File Upload + Rails 3.2.3 + Carrierwave + jCrop

В предыдущих статьях я рассказывал, как интегрировать Uploadify и Ajax-upload в приложения на Rails.

Сегодня я расскажу о том, как подключить в наше приложение ещё один загрузчик файлов: jQuery File Upload.

Подробного описания не будет, всё можно прочитать на странице данного плагина, а так же посмотреть в исходниках тестового приложения на Githab-e.

На самом деле приложение, расположенное на Githab-e, является практически законченным приложением для организации галерей. Оно позволяет создавать галереи, загружать в них изображения, просматривать изображения, а так же производить некоторые манипуляции с ними: добавлять описание, редактировать отображаемую часть картинки при помощи плагина jCrop.

Начну, пожалуй, с jQuery File Upload.

1.  Для начала я несколько изменил графическое представление самого плагина. Другое представление картинок, заимствованное из twitter bootstrap.

2. Во-вторых, искусственно создал ссылки для картинок, которые подгружены  ajax-ом после загрузки. Если все картинки в галереи можно просматривать последовательно, то подгруженные только по одиночке.

3. Загрузка картинок стартует автоматически.

Пожалуй, всё, что касается самого плагина. Всё остальное можно посмотреть в исходниках.

Настройки Carrierwave практически ничем не отличаются от настроек в предыдущих статьях. Разве что там я оставил настройки, которые позволяют делать серые превьюшки. Пользуйтесь.

Больше всего изменений произошло в танцах с «рельсами».

1. Для начала стоит ознакомиться с функцией create контроллера pictures_controller.rb. Обратите внимание, как мы получаем имя картинки, которую мы загрузили:

p_attr = params[:picture]
p_attr[:image] = params[:picture][:image].first if params[:picture][:image].class == Array

2. Так же стоит обратить внимание на ответ данной функции: ответ должен быть json-формате. В частности, отфет формируется так:

render :json => [@picture.to_jq_upload].to_json

3. Обращаю внимание на данный метод - to_jq_upload. Он реализован в модели:

def to_jq_upload
{
«name» => read_attribute(:image),
«size» => image.size,
«url» => image.url,
«thumbnail_url» => image.thumb.url,
«delete_url» => id,
«picture_id» => id,
«delete_type» => «DELETE»
}
end

Что-то кавычки тут неправильные, ну да не смертельно. Этот ответ специально сформирован для плагина jQuery File Upload. Без него приложение будет не функционально. Честно признаться, я его содрал где-то, а где -не помню уже. Немного подправил под свои нужды (-:

4. Обратите внимание на метод crop_image в модели, который вызывается после изменения картинки. Расскажу, для чего он вообще нужен. Дело всё в том, что связка jCrop + Carrierwave по умолчанию использует оригинальное изображение, которое было загружено. Если вы хотите сделать более, чем одно изменение картинки, то ничего у вас не выйдет: вы будите думать, что вырезаете в уже изменённой, а Carriervawe будет делать изменения в исходной картинке. Можете сами попробовать без данного метода. Единственное, что делает данный метод — это заменяет исходное изображение большой версией изменённого. Только и всего.

5. В принципе, как подружить Rails и jCrop хорошо рассказано в этом скринкасте (анг.). Огромная благодарность Райну за наводки на правильное решение.

Вот, в принципе, и всё. Будут вопросы по коду — спрашивайте, постараюсь ответить.

 

Июнь 15th, 2012 by none | 2 комментария

Ajax-upload + Carrierwave + Rails 3.2.3

Вчера я рассказал как настроить связку Uploadify 3.1 + Carrierwave + Rails 3.2.3.

Сегодня расскажу о другом ajax-аплоадере файлов и как заставить его работать с рельсами. Как и вчера, работающее приложение можно найти на Github-е.

В данном случае в качестве загрузчика я использовал ajax-upload. Работающий пример можете посмотреть на сайте автора. Простенький, без излишеств, аплоадер.

По традиции, начну именно с него.

  1. Так как это, типа, мультимедиа приложение, то я разрешил загружать только mp3 файлы.
  2. Как и в случае с Uploadify, пришлось подшаманить функцию _formatFileName, которая сокращала имена файлов, а это пагубно сказывалось на возможность подгрузки ajax-ом файлов с сервера.

В общем, ничего необычного, после отправки файла на сервер, информация о нём подгружается в уже существующую таблицу, всё просто.

Не много о настройках Carrierwave.

  1. Добавляем возможность нормального оперирования с файлами, содержащими не латинские символы, в частности, кириллицу: CarrierWave::SanitizedFile.sanitize_regexp = /[^a-zA-Zа-яА-ЯёЁ0-9\.\_\-\+\s\:]/
  2. А ещё я заменил директорию , куда будут сохранятся файлы, на «uploads/audio»

Вот и всё, что касается Carrierwave.

Теперь перейдём к махинациям с «рельсами».

  1. Добавьте в Gemfile gem ‘rack-raw-upload’. Это пригодится для работы с ajax-upload.
  2. Обратите внимание на фунцию create нашего контроллера, как получается имя нашего файла, который нужно сохранить в базе: file = params[:qqfile].is_a?(ActionDispatch::Http::UploadedFile) ? params[:qqfile] : params[:file]. Это всё из-за особенностей пересылки файлов нашим аплоадером.
  3. Обращаю Ваше внимание, что ответ от сервера должен быть в json-формате. Обязательно ответ должен содержать success: true, иначе на клиентской части будет выдаваться ошибка. Так же в ответе передаётся некоторая информация, которая необходима нам для обновления списка файлов.
  4. В application.rb необходимо добавить следующее: config.middleware.use ‘Rack::RawUpload’

Ну а в качестве проигрывателя я использовал jQuery Media Plugin. Тут тоже не обошлось без заковырок, так что в самом файле плагина исходную строчку заменил на mp3Player: ‘http://malsup.github.com/mediaplayer.swf’. И всё завертелось (-:

Вот, собственно, опять и всё. Надеюсь, кому-то будет полезным.

Май 24th, 2012 by none | Комментариев нет

Uploadify 3.1 + Carrierwave + Rails 3.2.3

Что-то давненько я ничего не писал (-:

Сразу скажу, что полностью всё подробно описывать не буду: всё можете сами посмотреть в исходниках на Github-е.  В данной статье я просто опишу некоторые моменты, которые были выявлены в процессе попыток заставить это всё работать друг с другом.

Во-первых, что касается Uploadify 3.1

  1. В новых версиях нет swfobject.js. Поэтому не стоит смотреть на реализацию на более ранних версиях — не будет работать.
  2. Файл uploadify.swf я разместил в /vendor/assets/javascript/ . Подключается это удовольствие следующим образом в настройках Uploadify: swf : ‘<%= asset_path(«uploadify.swf») %>’,
  3. Ещё я изменил несколько функцию onSelect  самого файла jquery.uploadify-3.1.js, т.к. там по умолчанию обрезаются имена файлов, которые свыше 25 символов и заменяются на «…». Мне это как-то не понравилось: плохо работала подгрузка ajax-ом изображений после их отправки на сервер. Поэтому я увеличил длину имени файла до 100 символов. Кому надо, может ещё увеличить.
Вроде бы всё, что касается непосредственно Uploadify.
Перейдём к Carrierwave. Тут ничего особенного, всё стандартно:
  1. У Вас должен быть установлен RMagick
  2. Чтобы Carrierwave корректно обрабатывал русские символы, а так другие служебные символу, например, пробел или двоеточие, необходимо в файл аплоадера добавить следующую строку: CarrierWave::SanitizedFile.sanitize_regexp = /[^a-zA-Zа-яА-ЯёЁ0-9\.\_\-\+\s\:]/
  3. Все загружаемые изображения обрезаются до размера 1024х768px, а превьюшка делается размером 100х100рх.

Ну и не много о рельсах. Тут как бы много нечего рассказывать. Единственное на что хочу обратить Ваше внимание — это на приватную функцию coerce в контроллере. Она осуществляет разбор параметров, которые передаёт Uploadify контроллеру перед добавлением картинки.

Ну вот, в общем-то, и всё.

Всем удачи (-:

Май 23rd, 2012 by none | 3 комментария

Gem magic_encoding

Знаете, несколько удручает каждый раз практически во всех файлах писать в начале файла #encoding: utf-8. Где-то всё равно забудешь, а потом постоянно ругается на кириллические символы. И вот буквально недавно открыл для себя простой и крайне полезный gem: magic_encoding.

Всё, что нужно сделать, это:

1. $ gem install magic_encoding

2. $ cd <project_dir>

3. $ magic_encoding

4. Всё. (-:

 

Теперь в начале каждого файла с расширением *.rb будет добавлена строчка   # -*- encoding : utf-8 -*-

Апрель 5th, 2012 by none | Комментариев нет

Загрузка SQL-файла в Rails

А Вы знаете, как загрузить данные из SQL-файла в базу Rails? Вот и я не знал до сегодня (-:

1. Для Rails 3:

$ rails db < path_to_sql_file.sql

2. Для Rails 2:

$ script/dbconsole < path_to_sql_file.sql

Правда, пока такой необходимости не возникало, но всё равно полезно.

Март 1st, 2012 by none | Комментариев нет