我有一个has_many :p hotos的Post模型。当用户创建新帖子时,用户还应该能够为给定帖子选择照片。
我正在使用RAILS 3.2.9,nested_form,carrierwave和jquery-fileupload-rails gem和ryan bates railscasts作为指南。
一切似乎都设置正确,但问题是,当用户选择照片(触发 fileupload() 功能)时,将创建新的帖子和新的照片记录。一旦我按"创建帖子",就会再次创建另一个帖子记录。
任何帮助/想法不胜感激。
谢谢。
切赫
class Post < ActiveRecord::Base
has_many :photos, as: :attachable, :dependent => :destroy
accepts_nested_attributes_for :photos, :allow_destroy => true
end
class Photo < ActiveRecord::Base
belongs_to :attachable, polymorphic: true
attr_accessible :image, :description, :post_id, :attachable_id, :attachable_type
mount_uploader :image, PhotoUploader
end
# Post Controller
def create
@post = Post.new(params[:post])
@post.save
end
# _form.html.erb
<%= nested_form_for @post, :html => { :multipart => true } do |f| %>
<%= f.fields_for :photos do |photo| %>
<% if photo.object.new_record? %>
<%= photo.file_field :image, id: "fileupload" %>
<%= photo.hidden_field :id %>
<%= photo.hidden_field :attachable_id %>
<%= photo.hidden_field :attachable_type %>
<% else %>
<%= image_tag(photo.object.image.url(:thumb)) %>
<%= photo.check_box :_destroy %>
<% end %>
<% end %>
<% end %>
#application.js
$('#fileupload').fileupload();
https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.fileupload.js#L140
文件上传插件会在您选择文件后立即通过 Ajax 提交表单(创建帖子)(请参阅源链接文件)。这将在他们选择对象后立即创建它。
为什么需要文件上传插件?您不需要通过 AJAX 提交它们,因此只需嵌套表单即可解决您的问题。只需将link_to_add和link_to_remove与常规文件字段一起使用即可。
编辑:
假设您想保留文件字段插件(似乎您确实保留了),那么您需要有一种接收它们的方法。
最好的方法是在帖子视图页面内,将文件上传代码嵌套在照片的表单中,而不是在帖子的嵌套表单中。这样,每张照片都会发布到照片创建选项,然后您可以在照片控制器中提供一个 javascript 回调,该回调使用隐藏字段更新 Post 表单,告诉它哪些photo_ids被上传到这篇文章(显然是保护这个!
我个人不喜欢这种方法,因为您将在用户创建帖子表单之前上传并接受文件(这意味着他们可以导航离开并在您的服务器上留下 5-10 张照片,与任何帖子无关)......但如果您希望他们能够使用 AJAX(又名文件上传插件)上传照片,这是一个必要的先决条件。
没有一个超级好的方法可以做到这一点,文件上传工作通常很混乱。我不知道有任何jQuery插件可以处理文件字段,并允许您将多个文件字段输入集转换为包含每个单独文件的隐藏字段。