я пытался загрузить несколько изображений с помощью стрекозы в rails3. я искал некоторые учебники, но не мог найти ни одного. Я нашел учебник по загрузке нескольких изображений с помощью Carrierwave, но не смог найти удачу со стрекозой .. помогите, пожалуйста :)
загрузка нескольких изображений с помощью стрекозы
Ответы (1)
Предисловие
Сама Dragonfly может использоваться для управления мультимедиа вашего проекта в целом, аналогично скрепка. Сам вопрос сводится к загрузке нескольких файлов в приложении 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, как и многие другие до меня.
В любом случае, я надеюсь, что смог дать некоторое представление.