4

私は、AJAX アップロード フォームを機能させようとして頭を悩ませてきました。Rails 3.2 を使用しています。gem "remotipart", "~> 1.0"Gemfileを入れて実行したところ、bundle install正常にインストールされました。

私は以前、この非 ajax アップロード フォームを持っていましたが、 github ページ:remote => trueの文献に従って追加しました。

<%= form_tag "/administration/data_imports", :multipart => true, :remote => true %>  
    <label for="file">Input File</label> <%= file_field_tag "file" %>
    <button type="submit">Import Data</button>
</form>

そしてこれは私のdata_imports_controller create行動で:

def create
  file = params[:file]
  filename = file.original_filename
end

jquery.remotipart.js明示的な指示はありませんが、不可欠だと感じたので、ページにjavascriptインクルードを追加しました..

私はそれを試してみましたが、サーバーエラーを出して失敗しました:

Completed 500 Internal Server Error in 4ms

NoMethodError (undefined method `original_filename' for nil:NilClass):
app/controllers/data_imports_controller.rb:16:in `create'

私が根本的に間違ったことをしているのは明らかですが、手を貸してください。

4

5 に答える 5

3

たくさんのデバッグとたくさんのコードを読んだ後、私はついにRails 3.2.8で動作する最新のgem(1.0.2)を手に入れました。私は3つの落とし穴に釘付けになりました:

  1. フォームを送信する前にファイル入力フィールドを無効にしていたため、remotipartはiframe送信に含めるためにそれを無視します。ファイル入力が有効になっていることを確認する必要があります。これはおそらくあなたが見ているものであり、'files'属性に別のセレクターを指定することがあなたのために働く理由です。
  2. デバッグの過程で、jquery.iframe-transportを最新のアップストリームソースでオーバーライドしていましたが、iframe内のX-Http-Accepts非表示変数をサポートしていません。remotipartgemにバンドルされているバージョンを使用する必要があります。
  3. 'script'以外のデータ型を使用している場合は、フォームにajax:completeのコールバックを接続することを忘れないでください。これは、グローバルajaxオプションでdataTypeを指定しない場合、またはフォームでdata-type属性を使用する場合のデフォルトです。
于 2012-11-07T08:10:44.157 に答える
1

私の場合、私はの古いバージョンを持っていましたjquery.iframe-transport.js

于 2013-06-27T07:42:11.467 に答える
1

よくわからない方法でボッジすることで、私が望んでいたことに沿って何かを達成することができましたが、ちょっとうまくいきました。次の行に沿ってjQueryを追加する必要がありました。

$("#myform").submit(function(e) {
    e.preventDefault();
    $.ajax(this.action, {
        files: $(":file", this),
        iframe: true
    }).complete( function(data) {
        eval(data.responseText);
    });
});

フォームの送信を引き継いで、この iframe-transport ラークで ajax 投稿を開始し、返されたものを評価します (私の場合は JavaScript を返すため)。:remote => trueまた、2回投稿していたフォームから削除する必要がありました。

誰かを助けたり、誰かをより良くするように導くことができるように、ここに投稿したいと思いました.

于 2012-08-15T08:21:59.783 に答える
1

あなたはラッキーです。少し前にまったく同じ問題がありました。:) これを application.js に追加します。

//= require jquery.remotipart
//= require jquery.iframe-transport

「iframe-transport」ファイルはhttp://cmlenz.github.com/jquery-iframe-transport/から取得できます。

そして、別の回答へのコメントとして言ったように、:multipartRails 3.2 を使用しているため、必要ないと思います。私はまだ Rails 3.1 を仕事で使用しているので、100% 確実ではありません。;)

それが役に立てば幸い!

編集

remotipart を追加して AJAX ファイルのアップロードを有効にする方法を示すサンプル アプリを作成しました。それは私にとってとてもうまくいきます。

https://github.com/RobinBrouwer/remotipart_example

実行された手順については、そのリポジトリ内のコミットを参照してください。

于 2012-08-14T15:42:48.910 に答える
0

問題は、実際にどのように宣言するかです:multipart=> true

以下のコードを使用すると、フォームは file パラメータを受け入れます。

 form_for "/administration/data_imports",:remote => true,:html => {:multipart => true}
于 2012-08-14T14:56:03.200 に答える