6

私はajaxを初めて使用しますが、Railsを使用するのは妥当です。ペーパークリップを使用して、基本的な複数のアタッチメントを設定しています。推奨事項has_manyアセットがあります。

推奨事項の編集フォームで、ユーザーがアセットを削除し、フィールドを確認、強調表示、フェードアウトできるようにします。

私が持っているlink_toコードは次のとおりです。

<%= link_to "Delete Attachment", destroy_asset_path(asset.id), :method => :delete, :confirm => "Are you sure?", :remote => true %>

かなり簡単です。次にassets_controller(私のルートに基づく)

def destroy_asset
     @asset = Asset.find(params[:id])
     @asset.destroy

     respond_to do |format|
       format.js
     end
  end 

これは機能し、アセットは破棄されます。ログ出力は次のとおりです。

Started DELETE "/asset/11" for 127.0.0.1 at 2012-12-19 10:27:42 -0800
  Processing by AssetsController#destroy_asset as JS
  Parameters: {"id"=>"11"}
  Asset Load (0.2ms)  SELECT "assets".* FROM "assets" WHERE "assets"."id" = $1 LIMIT 1  [["id", "11"]]
   (0.1ms)  BEGIN
[paperclip] Scheduling attachments for deletion.
[AWS S3 200 0.112224 0 retries] head_object(:bucket_name=>"bestofbauer-dev",:key=>"assets/11/original/DaffyDuck.jpg")
  SQL (0.2ms)  DELETE FROM "assets" WHERE "assets"."id" = $1  [["id", 11]]
[paperclip] Deleting attachments.
[paperclip] deleting /assets/11/original/DaffyDuck.jpg
[AWS S3 204 0.117975 0 retries] delete_object(:bucket_name=>"bestofbauer-dev",:key=>"assets/11/original/DaffyDuck.jpg")
   (11.7ms)  COMMIT
Rendered assets/destroy_asset.js (0.4ms)
Completed 200 OK in 268ms (Views: 9.8ms | ActiveRecord: 14.1ms)

これがdestroy_asset.jsで試していることです

$("#asset_<%= @asset.id %>").effect('highlight', {color:"#999"}, 3000).remove();

しかし、それはdivを強調したり、フェードアウトしたりしません...何かアイデアはありますか?

前もって感謝します

4

2 に答える 2

9

私は似たようなことをしましたが、イベントをajax:success(目立たない JS によって起動された) にバインドしただけです。つまり、コントローラーで何かを変更したり、新しい .js.erb テンプレートを追加したりする必要はありません。私の製品編集ページには、その製品に関連するすべての画像が表示され、それぞれに削除リンクがあります。

<div id="image-container">
  <% @product.images.each do |image| %>                                                                                                                                  
    <div class="image">
      <%= image_tag image.file.thumb %>
      <%= link_to "Destroy", admin_image_destroy_path(image), class: "destroy-image",  method: :delete, confirm: "Are you sure?", remote: true %>
    </div>
  <% end %>
</div>

そしてproducts.js.coffeeでは:

$("#image-container").on "ajax:success", "div a.destroy-image", (event, data, status, xhr) ->
  $(event.target).parent().fadeOut "slow", () ->
    $(this).remove() 

コントローラーから返された js を実行する必要はありません。フェードアウトしてから削除する前に、このハイライトを最初に作成するのはそれほど面倒ではありません。

詳細: https://github.com/rails/jquery-ujs/wiki/ajax

于 2012-12-19T18:45:04.320 に答える
1

あなたのコメントを読んで、このアイデアを思いつきました。id を別のインスタンス変数に保存し、それを js.erb ファイルで使用します。

def destroy_asset
 @asset = Asset.find(params[:id])
 @asset.destroy
 @asset_id = params[:id]

 respond_to do |format|
   format.js
 end
end 

$("#asset_<%= @asset_id %>").effect('highlight', {color:"#999"}, 3000).remove();
于 2012-12-19T18:57:01.867 に答える