2012-08-11 59 views
4

所以我在我的rails 3.1应用程序中使用回形针,可以使用回形针使用一个多文件选择输入来上传多个文件吗?

我正在使用关系将图像添加到项目,以便每个项目可以有多个图像。

我想要做的是能够单击浏览按钮并使用单个字段选择多个文件。而不必一次为每个领域制作一张图片。

任何人都知道如何做到这一点,或有一个伟大的选择,这样做不需要Flash插件?

回答

6

我只使用一个控制器,没有关联(我只是将多个图像上传到一个画廊),但我设法做你在问什么。你需要适应它来处理你的关系,但是它对我很好(虽然在IE中不起作用),但我确定它违反了一些轨道约定,但这是我能够构建的唯一途径功能。

的第一步是设置上传字段使用HTML5多标签接受多个文件:

<%= f.file_field :photo, multiple: 'multiple' %> 

或者,如果你使用simple_form我一样:

<%= f.input :photo, input_html: { multiple: 'multiple' } %> 

下步骤是将创建控制器操作更改为接受并处理多个文件。这是我肯定会反对的一点,但嘿,它的作品!

def create 

    params[:photo][:photo].each do |photo| 

    @params = {} 
    @params['photo'] = photo 

    @photo = Photo.new(@params) 

    if [email protected] 
     respond_to do |format| 
     format.html { redirect_to new_photo_path, error: 'An error occured uploading.' } 
     end 
    end 
    end 

    respond_to do |format| 
    format.html { redirect_to photos_path, notice: 'Photos were successfully uploaded.' } 
    end 
end 

所以,很简单比它看起来 - 对我来说,控制器的名字是photo,所以是字段名,其中解释了params[:photo][:photo]。它基本上只需要请求的:photo属性(其中控制器通常期望一个文件)并对已上载的文件进行迭代,从而为每个文件创建新的Photo并将photo属性@params设置为每个文件,然后尝试将其保存为新的Photo并提醒是否发生错误,否则一旦完成,它将重定向以显示照片。

正如我所说,这对我的伟大工程,我希望这有助于你太:)

编辑如果这没有帮助,你能告诉我为什么吗?在有人花时间帮助之后,忽略这些信息并不会让其他人想要帮助你。

2

不要修改控制器,只需添加name:属性的表单字段是这样的:

<%= f.input_field :photo, as: :file, multiple: true, name: 'article[photo]' %> 
0

这是我如何做的:

params[:photo][:photo].each do |photo| 
    record = Photo.create(photo: photo) 
    # if record.errors.any? 
    # flash[:notice] = record.errors.full_messages.to_sentence 
    # end 
end 

其它方法来节省见this post多个记录。

相关问题