2011-10-03 73 views
7

我想在rails3中与蜻蜓多图像上传。我搜索了一些教程,但找不到任何。我发现有Carrierwave多图片上传的教程,但无法找到与蜻蜓运气..任何帮助,请:)与蜻蜓多图像上传

回答

10

前言

Dragonfly本身可以用来管理媒体在一般项目中,类似于paperclip 。这个问题本身归结为一个rails应用程序中的多个文件上传。有关这个主题的一些教程可用,它可以很容易地适用于使用Dragonfly在其上存储特定文件的模型。我建议你看看这些,并尝试适应你的项目。但是,我可以展示一个我为当前正在开发的rails 3.2应用程序构建的最低示例,它并非完美(例如验证处理),但可以给出一些出发点。

只是为了参考,基本思想是从here服用。这个例子是用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具有newcreate行动(你可以,如果你想通过脚手架生成此,它是迄今为止没有任何幻想):

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模型通过custom validator限制在服务器端的图像数量:

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 

摘要

你可以建立很多从现有的教程,如蜻蜓不表现不同的方式对其他解决方案时,它来到只是上传文件。但是,如果你想要更有趣的东西,我建议jQuery Fileupload,就像我之前的其他人一样。

无论如何,我希望我能提供一些见解。

LG,

FLO