簡體   English   中英

在Rails中如何使用jquery-file-upload和CarrierWave處理多個多態文件上傳?

[英]In Rails how do I handle multiple, polymorphic file uploads with jquery-file-upload and CarrierWave?

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

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

每個Asset基本上都是一個帶有CarrierWave文件的模型。 通常我會在父模型(Project,Message等)上使用accepted_nested_attributes,並在fields_for塊中列出文件上載字段。

我的問題是,因為我正在使用帶有AJAX的jQuery-File-Uploader,所以當上傳文件時,父模型的表單將調用父模型的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

第三步:

編輯session_store.rb將代碼添加到文件末尾

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

第4步

Uploadify下載jquery.uploadify.js並解壓縮。

第五步:

  1. 如果使用Rails3.1或更高版本, jquery.uploadify.v2.1.4.min.jsswfobject.js復制到/app/assets/javascripts ,如果使用Rails 3.0或版本之前,則復制到/public/javascripts
  2. uploadify.swfcancel.png復制到/app/assets/images//public/images
  3. uploadify.css復制到/app/assets/stylesheets//public/stylesheets

第六步:

編輯您的application.js,在其下面插入代碼

//= require swfobject
//= require jquery.uploadify

第七步

在您上傳頁面中,添加此內容

<input id="uploadify" name="uploadify" type="file" />

第八步

將此代碼添加到您上傳頁面

$(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) {
    }
  });
});

第九步

像這樣寫你的控制器

def create
  @photo = Photo.new(:image => params[:Filedata])
  @photo.save
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM