以嵌套的Rails格式将多个图像上传到S3

时间:2014-03-16 20:44:24

标签: ruby-on-rails ruby file-upload amazon-web-services jquery-file-upload

我正在尝试使用Rails 4应用中的嵌套fields_for标记来上传文件。我已经遵循了几个Railscast,即:253381383,但仍然无法让它完全正常运行。还使用Carrierwave& jquery文件上传。

基本的app结构如下:

blogpost.rb

class Blogpost < ActiveRecord::Base
  has_many :blogpics
end

blogpic.rb

class Blogpic < ActiveRecord::Base
  belongs_to :blogpost
end

blogposts_controller.rb

def new
  @blogpost = Blogpost.new
  blogpic = @blogpost.blogpics.build
end

blogpost_form.html.erb

<div>
  <%= form_for @blogpost do |f| %>
    <%= render 'shared/error_messages', object: f.object %>

    <%= f.hidden_field :post_id %>
    <%= f.text_field :title %>
    <%= f.text_field :location %>
    <%= f.text_area :content %>

    <%= f.fields_for :blogpics do |builder| %>
        <%= builder.file_field :image %>
        <%= builder.hidden_field :blogpost_id %>
    <% end %>

    <p><%= f.submit %></p>
<% end %>

上传单个文件有效。但是,在文件字段中添加“:multiple =&gt; true,:name =&gt;'blogpic [image]'”会中断功能并且不会上传文件。

当我编辑blogposts_controller.rb时:

def new
  @blogpost = Blogpost.new
  3.times do
    blogpic = @blogpost.blogpics.build
  end
end

我可以单独输入三个文件,然后成功上传。 有什么方法可以实现这个功能,同时能够拖动和放大将多个文件放入一个输入?

非常感谢任何帮助和指导,谢谢。

2 个答案:

答案 0 :(得分:0)

您的blogpost模型缺少accepts_nested_attributes关联。

class Blogpost < ActiveRecord::Base
  has_many :blogpics
  accepts_nested_attributes_for :blogpics
end

我不太确定如何在一个对话框中处理多个文件。我想你会使用一些javascript来检测是否选择了多个文件,并为每个文件创建了字段表单。

答案 1 :(得分:0)

你可以传递:multiple =&gt;是builder.file_field :image上的参数。有关详细信息,请参阅http://apidock.com/rails/ActionView/Helpers/FormTagHelper/file_field_tag

使用文件输入的multiple属性,您可以拖放ONTO输入元素 有关详细信息,请参阅http://www.html5rocks.com/en/tutorials/file/dndfiles/#toc-selecting-files

我遇到了同样的问题(其中multiple:true打破了嵌套表单),我的理解是你必须在控制器接收之前手动转换params。如果你检查(使用pry或调试器)params散列,你需要比较提交父模型与几个输入文件(在单个输入上)VERSUS父模型与多个输入文件(在一个输入中)。前者创建一个子对象数组(每个对象都有自己的文件),而后者只创建一个子对象,其中所有图像都在一个数组中。