5

私のプロジェクトには、現在、次のようなさまざまなモデル(プロジェクト、メッセージなど)があります。

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

各アセットは基本的にCarrierWaveファイルを含むモデルです。通常、親モデル(Project、Messageなど)でaccepted_nested_attributesを使用し、ファイルアップロードフィールドをfields_forブロックにリストします。

私の問題は、AJAXでjQuery-File-Uploaderを使用しているため、ファイルがアップロードされるたびに、親モデルのフォームが親モデルの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

ステップ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. Rails3.1以降を使用している場合は jquery.uploadify.v2.1.4.min.jsswfobject.jsto 、Rails3.0以前のバージョンを使用している場合はにコピーします。/app/assets/javascripts/public/javascripts
  2. コピーuploadify.swfcancel.png/app/assets/images/または /public/images
  3. または 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
于 2011-11-15T09:38:23.287 に答える