12

以前は、Ajax を使用してビューの一部を更新したいときはいつでも、次のようにしていました。

  1. 更新したい部分からパーシャルを作成し、一意の ID を付けます。#tracks
  2. そのAjax呼び出しのコントローラーに特別なアクションを作成し、remove_trackすべての値を更新するなどして追加しますformat.js
  3. アクションと同じ名前の新しい JS ファイルを作成して、Railsremove_track.js.erbが次のような内容を含むファイルを自動的に呼び出すようにします。$('#tracks').html("<%=j render 'cds/show_tracks' %>");
  4. remote: trueこのアクションを呼び出すリンクに設定します。

indexこれですべて問題ありませんが、現在、柔軟性のために通常のメソッドを使用して共通ビューを削除および更新しようとしてdestroyいます。つまり、このメソッドを Ajax または通常の方法で呼び出すことができます。上記のすべてよりも良い方法が必要であるため、これは非常に一般的なことだと思いました。

destroy.js.erbこれをコントローラーに入れるだけで、destroy メソッドでファイルを呼び出すことができます。

  format.js { layout: false }

もちろんremote: true、リンクに設定します。

私ができないのは、ビューを更新することです。更新したいテーブルは、一意の ID を持つ div で囲まれていますが、部分的ではないため、コンテンツの更新を拒否しています。多分私は何かが足りない。

パーシャルを作成して上記の方法で更新しなければならない運命にあるのでしょうか、それとも (Turbolinks を使用する以外に) もっと魔法のような方法がありますか?

ありがとう。

PS また、これには、通常の CRUD ルートを使用して破棄するオブジェクト ID のみを渡すため、destroy メソッドに残りのパラメーターを渡すことができないという追加の欠点があることに気付きました。使用しようとした場合platform(action: destroy)、またはplatform(method: delete)エラーが発生した場合:

No route matches {:action=>"destroy", :controller=>"platforms"}

つまり、これらのパラメーターを渡したい場合は、新しいルートを作成する必要があります...

これらすべてのさらに別の欠点は、destroy メソッドで index メソッドにある検索と並べ替えのすべてのロジックを繰り返していることです。これは間違いなくそれを行う方法ではないと確信しています。

4

1 に答える 1

28

このページのおかげで、私はそれを行う適切な方法を見つけました。とてもシンプルで効果的です。

http://carmennorahgraydean.blogspot.com.es/2012/10/rails-328-ajax-super-basic-example.html

index.html.erb の destroy 行を更新します。

<%= link_to 'Destroy', pony, method: :delete, data: { confirm:
'Are you sure?' }, :remote => true, :class => 'delete_pony' %>

ファイル destroy.js.erb を作成し、他の .erb ファイル (app/views/ponies の下) の隣に配置します。次のようになります。

$('.delete_pony').bind('ajax:success', function() {     
  $(this).closest('tr').fadeOut();
});

format.js { render :layout => false } をコントローラーに追加します。

respond_to do |format|
 format.html { redirect_to ponies_url }
 format.json { head :no_content }
 format.js   { render :layout => false }
end

これが他の誰かに役立つことを願っています。

于 2013-07-19T09:50:22.083 に答える