Rails 3 - 嵌套模型 - has_many - jquery文件上传

时间:2013-01-25 20:59:37

标签: ruby-on-rails-3 carrierwave nested-attributes jquery-file-upload

我有一个帖子模型has_many:照片。当用户创建新帖子时,用户也应该能够为给定的帖子选择照片。

我使用RAILS 3.2.9,nested_form,carrierwave和jquery-fileupload-rails gem和ryan bates railscasts作为指南。

所有似乎都设置正确,但问题是,当用户选择照片(触发fileupload()函数)时,会创建新的Post和新的Photo记录。一旦我按下“创建帖子”,就会再次创建另一个帖子记录。

感谢任何帮助/想法。

非常感谢。

彼得

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();

1 个答案:

答案 0 :(得分:5)

https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.fileupload.js#L140

文件上传插件在您选择文件后立即通过Ajax(创建帖子)提交表单(请参阅源文件的链接文件)。这将在选择对象后立即创建。

为什么需要fileupload插件?您不需要通过AJAX提交它们,因此只需嵌套表单就能解决您的问题。只需将link_to_add和link_to_remove与常规文件字段一起使用即可。

编辑:

假设您想要保留文件字段插件(您似乎这样做),那么您需要有一种方法来接收它们。

执行此操作的最佳方法是在帖子视图页面内,将文件上传代码嵌套在您的照片的表单中,在Post的嵌套表单中。这样,每张照片都会发布到照片创建选项,然后你可以在照片控制器中提供一个javascript回叫,用隐藏字段更新Post表单,告诉它哪些photo_ids上传到这个帖子(显然确保这一点!)。

我个人不喜欢这种方法,因为你会在用户创建帖子表单之前上传并接受文件(这意味着他们可以离开并留下5-10张照片在您的服务器上没有绑定任何帖子)...但如果您希望他们能够使用AJAX(又名文件上传插件)上传照片,这是必要的先决条件。

这样做没有超级好的方法,文件上传工作通常很乱。我不知道任何在文件字段上工作的jQuery插件,并允许您将多个文件字段输入集转换为包含每个单独文件的隐藏字段。