5

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

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

每个资产基本上都是一个带有 CarrierWave 文件的模型。通常我只会在父模型(项目、消息等)上使用accepted_nested_attributes,并将文件上传字段列在fields_for块中。

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

关于如何让这个工作干净利落的任何想法?感谢您的关注。

4

1 回答 1

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

第三步

编辑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.js&复制swfobject.js到 ,如果您使用 Rails 3.0 或更低版本,则复制到。/app/assets/javascripts/public/javascripts
  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

第七步

在你上传页面,添加这个

<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
于 2011-11-15T09:38:23.287 回答