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

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

我有一个 Post 模型,它 has_many :photos。在用户创建新帖子时,用户还应该能够为给定帖子选择照片。

我正在使用 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 与常规文件字段一起使用。

编辑:

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

最好的方法是在帖 subview 页面中,将文件上传代码嵌套在照片的表单中,而不是嵌套在帖子的嵌套表单中。这样,每张照片都会发布到照片创建选项,然后您可以在照片 Controller 中提供一个 javascript 回调,使用隐藏字段更新发布表单,告诉它哪些 photo_ids 已上传到该帖子(显然确保这一点!)。

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

没有一种非常好的方法可以做到这一点,文件上传工作通常很困惑。我不知道有任何 jQuery 插件适用于文件字段并允许您将多个文件字段输入集转换为包含每个单独文件的隐藏字段。

关于ruby-on-rails-3 - Rails 3 - 嵌套模型 - has_many - jquery 文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14530307/

相关文章:

javascript - 保存 Rails 之前进行验证

ruby-on-rails-3 - 如何从演示者层渲染部分轨道?

ruby-on-rails-3 - Rails 3.2 HTML5多个文件上传,Carrierwave和没有Javascript

ruby-on-rails - 带有 Amazon S3 的 Carrierwave 配置,托管在 Heroku 上

ruby-on-rails-3.1 - 载波-Rails 3.1-未定义的方法:image_will_change

ruby-on-rails - 嵌套模型和父验证

css - 如何将 CSS 标签添加到 ruby​​ on rail loop?

ruby-on-rails - 从 Rails 应用程序上的 s3 存储桶中获取 1000 多个对象

ruby-on-rails-3 - Rails3 : Nested form doesn't save because id

ruby-on-rails - 对于 ID= 的文章,找不到 ID=1 的文章技能