загрузка нескольких изображений с помощью стрекозы - PullRequest
7 голосов
/ 03 октября 2011

Я пытался загрузить несколько изображений со стрекозой в rails3. Я искал некоторые учебники, но не мог их найти. я нашел учебник для загрузки нескольких изображений с Carrierwave, но не смог найти удачу с стрекозой ... любая помощь, пожалуйста:)

1 Ответ

10 голосов
/ 25 июня 2012

Введение

Саму стрекозу можно использовать для управления медиафайлами для вашего проекта в целом, аналогично скрепке . Сам вопрос сводится к загрузке нескольких файлов в приложении 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 , как и многие другие до меня.

В любом случае, я надеюсь, что смогу дать некоторое представление.

...