загрузка нескольких изображений с помощью стрекозы

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


person anand    schedule 03.10.2011    source источник


Ответы (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, как и многие другие до меня.

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

person Florian    schedule 25.06.2012