1

編集:

以下の有益なコメントに加えて、SteveSchwartzによる2つの優れた記事がすべてを明確に説明しています。

Rails 3.2.2 / jquery-rails 2.0.1 (jquery 1.7.1を使用)

フォームにファイルアップロードフィールドを追加するためのAJAXリクエストを送信するリンクがあります。 ページ関連のすべてが正しく機能します。新しいフォームフィールドのHTMLフラグメントがサーバーから取得され、フォーム内のdivに追加されます。

でも、

サーバーは2つのGET要求を受信します。1つはAJAXリクエストです。もう1つは、「通常の」アンカー要素GETのようです。「通常の」GETはRailsUJSによって停止されると思いました。

通常のリンクアクションを自分で無効にする必要がありますか?誰かが私が誤解していることと、代わりに[2番目の要求を防ぐために]何をすべきかを説明してもらえますか?

私はこの質問を見ました:Rails 3 UJS-コントローラーはlink_to:remoteによって2回呼び出されます。そこで、アセットパイプラインのコンパイルを変更してみconfig.assets.debug = falseましたが、効果がありませんでした。さらに、これはダブルAJAX GETリクエストではないので、別の問題だと思います。

助けてくれてありがとう!

サーバーログスニペット:

Started GET "/files/new?asset_number=2" for 127.0.0.1 at 2012-03-23 15:23:27 +0100

Started GET "/files/new" for 127.0.0.1 at 2012-03-23 15:23:27 +0100

ブラウザのHTML:

<a href="/files/new" data-remote="true" id="add_another_file" position="after" update="files">Add another file</a>

意見:

<%= link_to 'Add another file', new_file_path, :remote   => true,
                                               :update   => 'files',
                                               :position => 'after',
                                               :id       => 'add_another_file' %>

コントローラーのコーヒースクリプト:

$( ->
  $('a#add_another_file').click( ->
    url = '/files/new?asset_number=' + $('#files input').length
    $.get(url, ((data) -> $('#files').append(data)), 'html')))
4

3 に答える 3

5

clickにイベントを追加する場合は、Ajax リクエストを手動で行うため、a#add_another_fileを使用する必要はありません。:remote => true

また、clickイベントはデフォルト アクションの発生を防止する必要があります。これは、クリックイベントのコールバックevent.preventDefault();の先頭に追加することで実現できます。コールバックは引数を受け入れる必要があることに注意してください。event

于 2012-03-23T15:11:06.390 に答える
5

このオプションを使用する場合は、追加したカスタムクリックイベントを:remote => true削除する必要があります。これは、オプションが *jquery_ujs* ライブラリに のクリックをハイジャックするように指示するためです。したがって、独自の HTTP リクエストを作成する必要はありません。:remote => truea#add_another_file

次に、応答で何が行われるかを指示するために、で発生するさまざまなイベント( successerrora#add_another_fileなど) にバインドします。

バインドできる Ajax イベントの完全なリストは次のとおりです。

于 2012-03-24T02:46:10.917 に答える
1

実際には非常に単純です。リモートlink_toは 1 つの要求を (パラメーターなしで) 送信し、そのリンクにクリック イベントを追加して、別の要求を (パラメーター付きで) 送信しました。

次のように単純化する必要がありますlink_to

<%= link_to 'Add another file', new_file_path, :id => 'add_another_file' %>

次に、clickイベントで false を返して、URL に従わないようにする必要があります。

coffeescript で不要な括弧をたくさん使用しているようです。

$ ->
  $('a#add_another_file').click ->
    url = '/files/new?asset_number=' + $('#files input').length
    $.get url, ((data) -> $('#files').append(data)), 'html'
于 2012-03-23T15:11:08.923 に答える