Введение
Саму стрекозу можно использовать для управления медиафайлами для вашего проекта в целом, аналогично скрепке . Сам вопрос сводится к загрузке нескольких файлов в приложении rails. Доступны некоторые учебные пособия по этой теме, которые можно легко адаптировать к моделям, использующим Dragonfly для хранения на них определенных файлов. Я бы посоветовал вам изучить их и попытаться адаптировать для вашего проекта.
Тем не менее, я могу представить минимальный пример, который я создал для приложения rails 3.2, которое в настоящее время находится в разработке, который не идеален (например, обработка проверки), но может дать вам некоторые отправные точки.
Пример
Просто для справки, основная идея взята из здесь . Этот пример сделан с Rails 3.2.x.
Допустим, у вас есть база данных отпусков, где пользователи могут создавать отчеты о поездках, которые они проводили. Они могут оставить небольшое описание, а также несколько картинок.
Начнем с создания простой модели ActiveRecord для командировок, на данный момент давайте просто назовем ее Trip
:
class Trip < ActiveRecord::Base
has_many :trip_images
attr_accessible :description, :trip_images
end
Как вы видите, к модели прикреплены изображения поездок с помощью has_many
ассоциации. Давайте кратко рассмотрим модель TripImage
, в которой для хранения файла в поле содержимого используется стрекоза:
class TripImage < ActiveRecord::Base
attr_accessible :content, :trip_id
belongs_to :trip_id
image_accessor :content
end
Изображение поездки, которое оно само сохраняет вложение файла. Вы можете поместить любые ограничения в эту модель, например, Размер файла или MIME-тип.
Давайте создадим TripController
, который имеет действие new
и create
(вы можете сгенерировать его с помощью скаффолдинга, если хотите, это, безусловно, ничего особенного):
class TripController < ApplicationController
def new
@trip = Trip.new
end
def create
@trip = Trip.new(params[:template])
#create the images from the params
unless params[:images].nil?
params[:images].each do |image|
@trip.trip_images << TripImages.create(:content => image)
end
if @trip.save
[...]
end
end
Здесь нет ничего особенного, за исключением создания изображений из другой записи, кроме хеша params
. это имеет смысл, когда вы смотрите на поле загрузки файла в файле шаблона new.html.erb
(или частично, которое вы используете для полей модели Trip
):
[...]
<%= f.file_field :trip_images, :name => 'images[]', :multiple => true %>
[...]
На данный момент это должно работать, однако для изображений на этом нет никаких ограничений прямо сейчас. Вы можете ограничить количество изображений на стороне сервера с помощью пользовательского валидатора на модели Trip
:
class Trip < ActiveRecord::Base
has_many :trip_images
attr_accessible :description, :trip_images
validate :image_count_in_bounds, :on => :create
protected
def image_count_in_bounds
return if trip_images.blank?
errors.add("Only 10 images are allowed!") if trip_images.length > 10
end
end
Я оставляю это на ваше усмотрение, но вы также можете использовать клиентские проверки для файлового поля, общая идея заключается в проверке файлов после изменения файлового поля (в CoffeeScript):
jQuery ->
$('#file_field_id').change () ->
#disable the form
for file in this.files
#check each file
#enable the form
Резюме
Вы можете многое сделать из существующих учебных пособий, поскольку dragonfly не ведет себя так, как другие решения, когда дело доходит до просто при загрузке файлов. Однако, если вы хотите что-то более необычное, я бы предложил jQuery Fileupload , как и многие другие до меня.
В любом случае, я надеюсь, что смогу дать некоторое представление.