В Rails как мне обработать несколько полиморфных загрузок файлов с помощью jquery-file-upload и CarrierWave? - PullRequest
5 голосов
/ 15 апреля 2011

В моем проекте в настоящее время у меня есть различные модели (Project, Message и т. Д.), Которые:

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

Каждый актив - это в основном модель с файлом CarrierWave.Обычно я бы просто использовал accept_nested_attributes в родительской модели (Project, Message и т. Д.), И поля загрузки файлов были бы перечислены в блоке fields_for.

Моя проблема в том, что, поскольку я использую jQuery-File-Uploader с AJAX, форма родительской модели будет вызывать метод Create родительской модели при каждой загрузке файла.Остальные поля родительской модели могут быть еще не заполнены.Я думаю, может быть, я мог бы, чтобы загрузчик файлов вызвал метод create в контроллере Assets, но тогда мне бы хотелось как-то отправить класс родительской модели, чтобы полиморфная ассоциация сохранялась правильно.

Любые идеи о том, как я могу получить это работает чисто?Спасибо за поиск.

1 Ответ

4 голосов
/ 15 ноября 2011

OK.

Шаг 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

Step3

edit session_store.rb добавить код в конец файла

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

Step4

Загрузите jquery.uploadify.js с Загрузите и распакуйте его.

Step5

  1. Копировать jquery.uploadify.v2.1.4.min.js & swfobject.js в /app/assets/javascripts если вы используете Rails3.1 или новее, /public/javascripts если вы используете Rails 3.0 или более раннюю версию.
  2. Копировать uploadify.swf и cancel.png в /app/assets/images/ или /public/images
  3. Копировать uploadify.css в /app/assets/stylesheets/ или /public/stylesheets

Step6

Отредактируйте файл application.js, вставьте в него код ниже

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

Step7

На странице загрузки добавьте

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

Step8

добавить этот код на страницу загрузки

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

Step9

Напиши свой контроллер вот так

def create
  @photo = Photo.new(:image => params[:Filedata])
  @photo.save
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...