Rails personnalisé Twitter Bootstrap modal pour la méthode de suppression, Problème avec rappel

Le code suivant détruit les enregistrements comme prévu, mais le rappel est hérité d'un modeur à l'autre. Donc, alors qu'un enregistrement est correctement supprimé, Rails continue de chercher à en supprimer les précédemment supprimés. J'utilise une fenêtre modal Bootstrap de Twitter, qui se trouve dans un modèle de vue Rails et s'affiche lorsqu'une méthode de suppression Rails standard est déclenchée, en remplaçant la boîte de dialogue javascript régulière.

Comment effacer le rappel après avoir été licencié?

$.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'); }); } 

Edit: Étant donné que j'utilise le même mode de base encore et encore pour toute action de suppression, les rappels sont en attente. Donc, lorsqu'une action de suppression a été annulée, elle sera encore déclenchée sur une autre instance de suppression d'un objet différent, car le rappel est toujours valide. Bottom line: Comment effacer la file d'attente de rappel?

Il s'avère que c'est une mauvaise idée de manipuler la méthode de suppression native / callback pour diverses raisons. Ma solution de contournement est la suivante.

Avez-vous un bouton "supprimer" dans votre vue, avec certaines valeurs de données 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 ouvre la fenêtre modale. À l'intérieur, avoir un autre bouton "supprimer" avec un ensemble "à distance", donc l'action utilisera JS.

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

CloseModal est un autre: classe pour savoir quand fermer la fenêtre mod de bootstrap. J'ai mis une fonction supplémentaire pour cela dans mon application.js . Notez que le chemin par défaut a une valeur nulle, nous allons attacher l'ID de publication réel pour être supprimé via JS à l'étape suivante via le paramètre "id de données":

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

L'action de destruction dans notre contrôleur de postes utilisera JS pour rendre une animation pour la publication supprimée:

 #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 

Insérez ici les effets comme vous le souhaitez. Dans cet exemple, nous sommes simplement en train de faire disparaître la publication supprimée:

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

Dans l'ensemble, cela fonctionne très bien!