Rails自定义Twitter引导模式删除方法,回调问题

Rails custom Twitter Bootstrap modal for delete method, Problem with callback

本文关键字:方法 回调 问题 删除 模式 自定义 Twitter Rails      更新时间:2023-09-26

下面的代码按预期销毁记录,但是回调从一个模态继承到下一个模态。因此,当记录被正确删除时,Rails也会继续查找删除以前删除的记录。我正在使用Twitter Bootstrap模态窗口,它位于Rails视图模板中,并在触发标准Rails删除方法时显示,取代常规javascript对话框。

如何在回调被触发后清除它?

$.rails.allowAction = function(element) {
  var message = element.data('confirm'),
  answer = false, callback;
  if (!message) { return true; }
  if ($.rails.fire(element, 'confirm')) {
    myCustomConfirmBox(message, function() {
     callback = $.rails.fire(element,
       'confirm:complete', [answer]);
     if(callback) {
       var oldAllowAction = $.rails.allowAction;
       $.rails.allowAction = function() { return true; };
       element.trigger('click');
       $.rails.allowAction = oldAllowAction;
     }
    });
  }
  return false;
}
function myCustomConfirmBox(message, callback) {
    $('#dialog-confirm').modal('show');
    $('#dialog-confirm button.primary').click(function(){
        callback();
        $('#dialog-confirm').modal('hide');
    });
}

编辑:由于我对任何删除操作一遍又一遍地使用相同的基本模态,回调会排队。因此,当删除操作之前被取消时,它仍然会在不同对象的另一个删除实例上触发,因为回调仍然有效。底线:如何清除回调队列?

事实证明,由于各种原因,摆弄本机删除方法/回调是一个坏主意。我的变通方案如下:

在你的视图中有一个"删除"按钮,带有一些JS数据值:

#delete button in view template
link_to "delete", "#", 
   :class => "delete_post", 
   "data-id" => YOUR_POST_ID, 
   "data-controls-modal" => "YOUR_MODAL_LAYER",
       #more bootstrap options here…

Bootstrap打开模态窗口。在其中,设置另一个"delete"按钮并设置"remote",这样操作将使用JS。

#delete button in modal window
link_to "delete", post_path(0), 
   :method => :delete, 
   :class => "btn primary closeModal", 
   :remote => true  

closemmodal 是我知道何时关闭引导模态窗口的另一个类。我在我的application.js中添加了一个额外的函数。注意,默认的路径有一个nil值,我们将在下一步中通过"data-id"参数附加要通过JS删除的真实post ID:

#application.js 
$('a.delete_post').live('click', function(){
    _target = $(this).data('id');
    $('#YOUR_MODAL_LAYER .primary').attr('href', '/posts/' + _target);
});

post控制器中的destroy动作将使用JS为被删除的post渲染动画:

#posts_controller.rb
def destroy
    @post = Post.find(params[:id])
    @post.destroy
    respond_to do |format|
       # format.html { redirect_to(posts_url) }
       format.js { render :content_type => 'text/javascript' }
    end
end

在这里插入您喜欢的效果。在本例中,我们简单地淡出已删除的帖子:

#views/posts/destroy.js    
$("div#post-<%= params[:id] %>").fadeOut();

总的来说,这工作非常顺利!