ajaxを使用してRailsアプリケーションにファイルをアップロードしようとしています。これを容易にするために、jQuery.remotipartgemを含めました。
// app/assets/javascripts/application.js
//= require jquery.remotipart
ファイルをアップロードするためのフォームがあります。これらのファイルはCarrierWaveによって処理されます。
<%= form_for @import, remote: true do |f| %>
<fieldset>
<%= f.label :file, "Attach a CSV file" %>
<%= f.file_field :file %>
</fieldset>
<%= f.submit :upload %>
<% end -%>
残念ながら、ファイルを添付してフォームを送信すると、コントローラーのアクションに正しく到達しないようです。paramsハッシュはJSオブジェクトをキーとして文字列化しました。
Started POST "/file_imports" for 127.0.0.1 at 2012-11-06 01:00:49 +0000
Processing by FileImportsController#create as JS
Parameters: {"object Object"=>{","=>{"object Object"=>{","=>{"object Object"=>nil}}}}}`
Chromeの開発ツールでは、これが実際にサーバーに送信されているフォームデータであることがわかります。
フォームを削除すると、フォームは完全に機能しremote: true
ます(もちろん、その場合、JSリクエストではなくHTMLリクエストを送信します)。
誰かが私が間違っていることを知っていますか?ちなみに私はRails3.2.8とRemotipart1.0.2(最新)を使用しています。
編集:もう少し掘りました。
Remotipartのソースを調べてみると、それが何をするのか理解できないようです。たとえば、vendor/assets/javascripts/jquery.remotipart.js
の22行目は次のようになっています。
settings.data = form.serializeArray();
もう少し下に、設定はを介してサーバーに送信されます$.rails.ajax(settings)
。
この$.fn.serializeArray()
メソッドは、JSオブジェクトの配列を返します。それらをへの呼び出しのデータ属性に割り当てるとjQuery.ajax()
、サーバーに表示されているシリアル化されたオブジェクトパラメーターが考慮されます。オブジェクトの配列ではなく、データ属性としてオブジェクトを渡す必要がありますか?
ただし、配列を1つのオブジェクトにフラット化しようとすると、すべてが壊れて、JSではなくHTMLリクエストがサーバーに送信されます。それはという事実と関係があると思いますjQuery.ajax.processData == false
。