4

所以我在我的 rails 3.1 应用程序中使用回形针,

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

我想做的是能够单击浏览按钮并仅使用单个字段选择多个文件。而不是必须为每个字段一次处理一张图像。

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

4

3 回答 3

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 !@photo.save
      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@paramsPhoto

正如我所说,这对我很有用,我希望它对你也有帮助:)

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

于 2012-08-12T09:54:36.690 回答
3

不要修改控制器,只需将name:属性添加到表单字段,如下所示:

<%= f.input_field :photo, as: :file, multiple: true, name: 'article[photo]' %>
于 2013-02-22T00:53:07.627 回答
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

有关保存多条记录的替代方法,请参阅此帖子。

于 2016-01-09T21:00:58.580 回答