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

时间:2011-04-15 17:52:35

标签: ruby-on-rails ruby-on-rails-3 jquery polymorphism carrierwave

在我的项目中,我目前有不同的模型(项目,消息等):

has_many :assets, :as => :attachable, :dependent => :destroy

每个资产基本上都是一个带有CarrierWave文件的模型。通常我会在父模型(Project,Message等)上使用accepted_nested_attributes,并在fields_for块中列出文件上载字段。

我的问题是,因为我正在使用带有AJAX的jQuery-File-Uploader,所以当上传文件时,父模型的表单将调用父模型的Create方法。其余的父模型字段可能尚未填写。我想也许我可以让文件上传器调用Assets控制器中的create方法,但是我会有一些如何发送父模型的类以便正确存储多态关联。

关于如何干净利落地工作的任何想法?谢谢你的期待。

1 个答案:

答案 0 :(得分:4)

行。

第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

步骤3

编辑session_store.rb将代码添加到文件末尾

Rails.application.config.middleware.insert_before(
  ActionDispatch::Session::CookieStore,
  FlashSessionCookieMiddleware,
  Rails.application.config.session_options[:key]
)

步骤4

Uploadify下载jquery.uploadify.js并解压缩。

步骤5

  1. 复制jquery.uploadify.v2.1.4.min.js& swfobject.js来 如果您使用Rails3.1或更高版本,则/app/assets/javascripts /public/javascripts如果您使用Rails 3.0或版本之前。
  2. uploadify.swfcancel.png复制到/app/assets/images//public/images
  3. uploadify.css复制到/app/assets/stylesheets//public/stylesheets
  4. 步骤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