首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用dragonfly上传多张图片

问用dragonfly上传多张图片
EN

Stack Overflow用户
提问于 2011-10-03 20:17:02
回答 1查看 3.9K关注 0票数 7

我试着在rails3中用dragonfly上传多张图片。我搜索了一些教程,但没有找到。我找到了一个使用Carrierwave上传多张图片的教程,但是找不到使用dragonfly的机会。如有任何帮助,请:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-25 20:13:30

前言

通常,与paperclip类似,Dragonfly本身也可用于管理项目的媒体。这个问题本身可以归结为rails应用程序中的多个文件上传。关于这个主题的一些教程,可以很容易地改编到使用Dragonfly在模型上存储特定文件的模型。我建议您研究一下这些内容,并尝试根据您的项目进行调整。

但是,我可以给出一个我为当前正在开发的Rails3.2应用程序构建的最小示例,它并不完美(例如验证处理),但可以为您提供一些起点。

示例

仅供参考,其基本思想取自here。这个例子是使用Rails 3.2.x完成的。

假设您有一个度假数据库,用户可以在其中创建有关他们度假的旅行报告。他们可能会留下一个小的描述,以及一些图片。

从为trips构建一个简单的基于ActiveRecord的模型开始,让我们暂时将其称为Trip:

代码语言:javascript
复制
class Trip < ActiveRecord::Base
    has_many :trip_images
    attr_accessible :description, :trip_images
end

正如您所看到的,该模型具有通过has_many关联附加的trip图像。让我们快速了解一下TripImage模型,它使用dragonfly将文件存储在content字段中:

代码语言:javascript
复制
class TripImage < ActiveRecord::Base
    attr_accessible :content, :trip_id
    belongs_to :trip_id

    image_accessor :content
end

trip图像本身存储了文件附件。您可以在此模型中设置任何限制,例如文件大小或mime类型。

让我们创建一个具有new和create动作的TripController (如果你喜欢,你可以通过脚手架来生成它,到目前为止没有什么花哨的东西):

代码语言:javascript
复制
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模型上的字段的部分)中的文件上传字段时,这是有意义的:

代码语言:javascript
复制
[...]
<%= f.file_field :trip_images, :name => 'images[]', :multiple => true %>
[...]

这应该是暂时有效的,然而,现在对这个图像没有限制。您可以通过Trip机型上的custom validator限制服务器端的镜像数量:

代码语言:javascript
复制
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中):

代码语言:javascript
复制
jQuery ->
    $('#file_field_id').change () ->
         #disable the form
         for file in this.files
             #check each file  
         #enable the form

摘要

你可以在现有教程的基础上构建很多东西,因为在上传文件方面,dragonfly的表现与其他解决方案没有什么不同。但是,如果你想要更花哨的东西,我会推荐jQuery Fileupload,就像我之前的许多人一样。

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

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7634869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档