在Rails中,如何使用jquery-file-upload和CarrierWave处理多个多态文件上传?

| 在我的项目中,我目前有不同的模型(Project,Message等):
has_many :assets, :as => :attachable, :dependent => :destroy
每个资产基本上都是带有CarrierWave文件的模型。通常,我只在父模型(Project,Message等)上使用acceptd_nested_attributes,并在fields_for块中列出文件上传字段。 我的问题是,由于我将jQuery-File-Uploader与AJAX结合使用,因此,无论何时上传文件,父模型的表单都会调用父模型的Create方法。其余的父模型字段可能尚未填写。我在想,也许我可以让文件上传器在Assets控制器中调用create方法,但是接下来我将介绍一些如何发送父模型的类,以便正确存储多态关联的方法。 关于如何使它正常工作的任何想法?感谢您的关注。     
已邀请:
好。 步骤1 向您添加
gem \'carrier wave\'
Gemfile 第2步 保存代码到
/lib/flash_session_cookie_middleware.rb
require \'rack/utils\'

class FlashSessionCookieMiddleware
  def initialize(app, session_key = \'_session_id\')
    @app = app
    @session_key = session_key
  end

  def call(env)
    if env[\'HTTP_USER_AGENT\'] =~ /^(Adobe|Shockwave) Flash/
      req = Rack::Request.new(env)
      env[\'HTTP_COOKIE\'] = [ @session_key,
                             req.params[@session_key] ].join(\'=\').freeze unless req.params[@session_key].nil?
      env[\'HTTP_ACCEPT\'] = \"#{req.params[\'_http_accept\']}\".freeze unless req.params[\'_http_accept\'].nil?
    end

    @app.call(env)
  end
end
第三步 编辑ѭ4the将代码添加到文件末尾
Rails.application.config.middleware.insert_before(
  ActionDispatch::Session::CookieStore,
  FlashSessionCookieMiddleware,
  Rails.application.config.session_options[:key]
)
第四步 从Uploadify下载jquery.uploadify.js并解压缩。 步骤5 将
jquery.uploadify.v2.1.4.min.js
swfobject.js
复制到
/app/assets/javascripts
,如果您使用Rails3.1或更高版本,
/public/javascripts
,如果使用的是Rails 3.0或更低版本。 将
uploadify.swf
cancel.png
复制到
/app/assets/images/
/public/images
uploadify.css
复制到
/app/assets/stylesheets/
/public/stylesheets
步骤6 编辑您的application.js,在其中插入以下代码
//= require swfobject
//= require jquery.uploadify
步骤7 在您的上传页面中,添加此内容
<input id=\"uploadify\" name=\"uploadify\" type=\"file\" />
步骤8 将此代码添加到您的上传页面
$(document).ready(function() {
  <% key = Rails.application.config.session_options[:key] %>
  var uploadify_script_data = {};
  var csrf_param = $(\'meta[name=csrf-param]\').attr(\'content\');
  var csrf_token = $(\'meta[name=csrf-token]\').attr(\'content\');
  uploadify_script_data[csrf_param] = encodeURI(encodeURIComponent(csrf_token));
  uploadify_script_data[\'<%= key %>\'] = \'<%= cookies[key] %>\';

  $(\'#uploadify\').uploadify({
    uploader        : \'/assets/uploadify.swf\',
    script          : \'/photos\',
    cancelImg       : \'/images/cancel.png\',
    auto            : true,
    multi           : true,
    removeCompleted : true,
    scriptData      : uploadify_script_data,
    onComplete      : function(event, ID, fileObj, doc, data) {
    }
  });
});
步骤9 这样写你的控制器
def create
  @photo = Photo.new(:image => params[:Filedata])
  @photo.save
end
    

要回复问题请先登录注册