你能告诉我,如何在销毁方法结束之前删除对象。当我使用下一个模式时,删除对象发生在删除照片时,但需要 1 或 3 秒或更长时间。
_form(编辑操作)
<% listing.photos.each do |photo|%>
<%= image_tag photo.image.thumb, class: 'thumbnail', id: "test"%>
<%= link_to "remove", photo_path(photo),class: 'btn btn-primary', method: :delete, data: { confirm: 'Are you sure?' }, remote: true %>
销毁.js.erb
$('#test').remove();
如何使用此模式
_形式:
<div id="test_<%= photo.id %>">
<%= image_tag photo.image.thumb, class: 'thumbnail'%>
<%= link_to "remove", photo_path(photo),class: 'btn btn-primary', method: :delete, data: { confirm: 'Are you sure?' }, remote: true %>
销毁.js.erb:
$('#edit_image_<%= @photo.id %>').remove();
服务器上真正销毁之前从 DOM 中删除图像以避免延迟,你可以在单击"删除"按钮时应用 event.preventDefault()。这将允许您重写"删除"按钮的正常行为。查看此示例,了解如何在原始事件之前执行一些 UI 操作,然后触发它。
另请注意,在不确定它通常已被删除的情况下从 UI 中删除某些内容不是一个好主意。对于用户来说还不够清楚。因此,也许最好先隐藏图像,以防在销毁图像时出现服务器错误,您将再次显示它并显示一些指导性消息。
UPD
考虑以下标记
<div id="test_<%= photo.id %>">
<%= image_tag photo.image.thumb, class: 'thumbnail' %>
<%= link_to "remove", "#", class: 'remove btn btn-primary', data: { id: photo.id, url: photo_path(photo) } %>
</div>
另一种选择是使用单独的 jQuery.ajax() 调用重写remote: true
。
$('.btn.remove').click(function () {
var $target = $(this).parents('#test_' + $(this).data('id'));
$.ajax({
url: $(this).data('url'),
method: 'DELETE',
beforeSend: function() {
$target.hide() # hiding corresponding image
},
error: function () {
$target.show() # revert hiding on error
console.log("Sorry! Couldn't remove image.") # log message
}
})
})
有一种更干净的方法可以在没有js.erb
模板的情况下做到这一点:
<div class="photo">
<%= image_tag photo.image.thumb, class: 'thumbnail'%>
<%= link_to "remove", photo_path(photo),class: 'destroy btn btn-primary', method: :delete, data: { remote: true, type: 'json', confirm: 'Are you sure?' } %>
<div>
现在只需设置一个 ajax 处理程序:
// app/assets/javascripts/photos.js
$(document).on('ajax:success', '.photo .destroy.btn', function(){
$(this).parent('.photo').remove();
});
并将控制器设置为返回正确的响应代码。
class PhotosController
def destroy
@photo = Photo.find(params[:id])
@photo.destroy!
respond_to do |format|
format.json do
head :no_content
end
end
end
end
这使客户端逻辑保持app/assets/javascripts
,可以在其中缓存和缩小,而不是将其分散在一堆美化的脚本标记中。