簡體   English   中英

Rails 通過 Ajax 遠程刪除和更新視圖

[英]Rails remote delete and update view through Ajax

過去,每當我想通過 Ajax 更新視圖的一部分時,我都會執行以下操作:

  1. 從我想要更新的部分中創建一個部分,並給它一個唯一的 ID,比如#tracks
  2. 在控制器中為該 Ajax 調用創建一個特殊操作,例如remove_track更新所有值等並添加format.js
  3. 創建一個與操作同名的新 JS 文件,以便 Rails 自動調用它remove_track.js.erb ,其中包含如下內容: $('#tracks').html("<%=j render 'cds/show_tracks' %>");
  4. 在調用此操作的鏈接中設置remote: true

所有這一切都很好,但現在我正嘗試使用常規的destroy方法來刪除和更新公共index視圖以獲得靈活性,這意味着我可以通過 Ajax 或正常調用此方法。 我認為這是一件很常見的事情,必須有比上述所有方法更好的方法。

我可以通過簡單地將其放入控制器來獲取 destroy 方法來調用我的destroy.js.erb文件:

  format.js { layout: false }

當然,在鏈接上設置remote: true

我不能做的是讓視圖刷新。 我要刷新的表被封裝在一個具有唯一 ID 的 div 中,但由於它不是局部的,因此它拒絕刷新內容。 也許我錯過了一些東西。

我注定要創建一個部分並使用上述方法刷新它,還是有更神奇的方法(除了使用 Turbolinks)?

謝謝。

PS另外,我剛剛注意到這有一個額外的缺點,即我無法將其余的參數傳遞給 destroy 方法,因為它只傳遞對象 ID 以使用常規 CRUD 路由進行銷毀。 如果我嘗試使用platform(action: destroy)platform(method: delete)我會收到錯誤消息:

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

這意味着如果我想傳遞這些參數,我必須創建一個新路由......

所有這一切的另一個缺點是,我在銷毀方法中再次重復了索引方法中的所有搜索和排序邏輯。 我確定這絕對不是這樣做的方法。

感謝這個頁面,我找到了正確的方法。 如此簡單有效。

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

希望這對其他人有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM