Rails уничтожает подтверждение с помощью JQuery AJAX
У меня это работает по большей части. Ссылка на рельсы:
<%= link_to(image_tag('/images/bin.png', :alt => 'Remove'), @business, :class => 'delete', :confirm => 'Are you sure?', :id => 'trash') %>
:class => "delete"
вызывает функцию ajax, так что она удаляется, а страница не обновляется, что отлично работает. Но поскольку страница не обновляется, она все еще существует. Таким образом, моя мусор id вызывает эту функцию jquery:
$('[id^=trash]').click(function(){
var row = $(this).closest("tr").get(0);
$(row).hide();
return false;
});
Что скрывает строку любого значка корзины, на который я нажал. Это также отлично работает. Я думал, что все это сработало, и тогда я столкнулся с этой проблемой. Когда вы нажмете на мой мусор, я могу открыть окно подтверждения, чтобы спросить вас, уверены ли вы. Независимо от того, выбираете ли вы отмену или принятие, jquery срабатывает, и он скрывает строку. Он не удаляется, только скрывается, пока вы не обновите страницу. Я попытался изменить его, чтобы запрос выполнялся через jquery, но затем рельсы удаляли строку независимо от того, что я выбираю в своем приглашении, потому что вызывалась функция .destroy при вызове приглашения.
Мой вопрос в том, как я могу получить значение для отмены или принятия из подсказки для подтверждения, чтобы в моем jquery у меня может быть инструкция if, которая скрывается, если они нажимают кнопку accept и ничего не делают, если они нажимают на отмену.
EDIT: ответ на вопрос ниже.
Это не сработало. Я попытался изменить свою ссылку на:
<%= link_to(image_tag('/images/bin.png', :alt => 'Remove'), @business, :class => "delete", :onclick => "trash") %>
и помещая это в мой jquery
function trash(){
if(confirm("Are you sure?")){
var row = $(this).closest("tr").get(0);
$(row).hide();
return false;
} else {
//they clicked no.
}
}
Но функция никогда не вызывалась. Он просто удаляет его без подсказки и не скрывает его.
Но это дало мне представление.
Я взял функцию удаления, которую ajax вызывал
$('a.delete').click (function(){
$.post(this.href, {_method:'delete'}, null, "script");
$(row).hide();
});
И изменил его реализацию вашего кода:
удалить :confirm => 'Are you sure?'
$('a.delete').click (function(){
if(confirm("Are you sure?")){
var row = $(this).closest("tr").get(0);
$.post(this.href, {_method:'delete'}, null, "script");
$(row).hide();
return false;
} else {
//they clicked no.
return false;
}
});
Что делает трюк.
Ответы
Ответ 1
remove: confirm = > 'Вы уверены?'
$('a.delete').click (function(){
if(confirm("Are you sure?")){
var row = $(this).closest("tr").get(0);
$.post(this.href, {_method:'delete'}, null, "script");
$(row).hide();
return false;
} else {
//they clicked no.
return false;
}
});
Ответ 2
Спасибо, ребята, я использовал следующий учебник для настройки jquery с рельсами:
http://www.notgeeklycorrect.com/english/2009/05/18/beginners-guide-to-jquery-ruby-on-rails/
при использовании в сочетании с этим руководством я использовал следующий код:
Query.fn.deleteWithAjax = function() {
this.removeAttr('onclick');
this.unbind('click', false);
this.click(function() {
if(confirm("Are you sure?")){
$.delete_($(this).attr("href"), $(this).serialize(), null, "script");
return false;
} else {
//they clicked no.
return false;
}
})
return this;
};
Ответ 3
Вы можете удалить:
:confirm => 'Are you sure?'
и замените его обычным событием onclick, например:
<%= link_to(image_tag('/images/bin.png', :alt => 'Remove'), @business, :class => 'delete', :onclick => 'someJSFunction', :id => 'trash') %>
Затем в вашем приложении application.js(или любом другом JS файле) выполните:
function someJSFunction(){
if(confirm("Are you sure?"){
//they clicked yes.
} else {
//they clicked no.
}
}
Извините, у меня нет времени, чтобы проверить его прямо сейчас, но что должен работать.
Ответ 4
У меня была аналогичная проблема, но после прочтения этого потока я удалил подтверждение с моей кнопки и сделал следующее в jquery:
$('.delete_post').on('click', function(){
if(confirm("Are you sure?")){
$(this).closest('tr').delay().fadeOut();
} else{
return false;
}
});
И это, кажется, делает трюк для меня. Я также добавил это к моему действию уничтожения в контроллере:
respond_to do |format|
format.html { render :nothing => true }
format.json { head :no_content }
P.S. Не забудьте добавить: remote = > true в link_to