我正在尝试使用Rails 4应用中的嵌套fields_for标记来上传文件。我已经遵循了几个Railscast,即:253,381,383,但仍然无法让它完全正常运行。还使用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
我可以单独输入三个文件,然后成功上传。 有什么方法可以实现这个功能,同时能够拖动和放大将多个文件放入一个输入?
非常感谢任何帮助和指导,谢谢。
答案 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父模型与多个输入文件(在一个输入中)。前者创建一个子对象数组(每个对象都有自己的文件),而后者只创建一个子对象,其中所有图像都在一个数组中。