2009-08-12 3 views
2

Итак, у меня есть команда destroy. Проблема в том, что я не хочу, чтобы мои пользователи могли удалять эту категорию, если она содержит элементы. Поэтому у меня есть оператор if в методе my destroy. Это работает отлично, но я использую AJAX для загрузки страницы и использования файла destroy.js.erb. Мой метод ниже:format.js с Rails

def destroy 
    @promotion_type = PromotionType.find(params[:id]) 

    if Promo.find_by_promotion_type_id(params[:id]).nil? 
    @promotion_type.destroy 

    respond_to do |format| 
     format.html { redirect_to(promotion_types_url) } 
     format.js {render :layout => false } 
     format.xml { head :ok } 
    end 
    else 
     respond_to do |format| 
     format.js {} 
     end 
    end 
    end 

Это мой Javascript (JQuery):

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

Одна из моих проблем является то, что когда-то они щелкают да, она скрывает строку и AJAX удаляет свое. Если я не скрою его, он будет удален, но поскольку страница не обновляется, похоже, что она не была удалена, поэтому я скрываю ее для эффекта. Единственная проблема с этим решением - когда я попадаю в свои категории. Я не хочу, чтобы пользователи удаляли его, если в нем есть элементы. Я не могу бросить код ruby ​​в свой файл javascript, и я не могу (или не знаю, каким образом) метать javascript-переменные или $ (this) в файл .js.erb.

Код работает корректно по большей части, но теперь он прячет строку, даже если она не удалась. Поэтому я собирался бросить предупреждение («Невозможно удалить»); в мой файл .js.erb, но это предупреждение срабатывает независимо от того, было оно или не было удалено. Я уверен, что есть лучшее решение, чтобы сделать все это, но я этого не знаю.

ответ

1

Почему бы вам просто не вернуть истину или ложь в зависимости от того, была ли она удалена? Определите обратный вызов в вашем $.post, чтобы обработать это.

$.post(yourURL, yourDATA, function(data){ myCallback(data); }, "text"); 

function myCallback(data) { 
    if(data === "true") 
     ... 
    else 
     ... 
} 

Я использовал «текст» в качестве формата ответа для демонстрации. Возможно, вам понадобится нечто вроде «json». Формат «скрипт», который у вас есть, будет обрабатывать ваш ответ как javascript; поскольку вы сказали, что скопировали это откуда-то, я не думаю, что «то, что вам действительно нужно. ИМО, то, что возвращается, должно быть только данными, так как вы получаете с форматами «xml», «text» или «json». Вы можете найти больше на jQuery docs page.

+1

Можете ли вы пойти дальше indepth? Я получил код .post с другого сайта и добавил остальные, поэтому я не уверен, как это работает. – Mike

2

Как geowa4 говорит, что вы можете сделать следующий

$('a.delete').click (function(){ 
     if(confirm("Are you sure?")){ 
      var row = $(this).closest("tr").get(0); 
      $.post(
       this.href, 
       {_method:'delete'}, 
       function(data){$(row).hide();}, 
       "script" 
      ); 
      // Move from here to the callback 
      //$(row).hide(); 
      return false; 
     } else { 
      //they clicked no. 
      return false; 
     } 
} 

В качестве альтернативы вы могли бы просто иметь «скрыть» код JS в вашем .js.erb файла вместе с предупреждением. Вам также необходимо передать переменную (@destroyed) в erb, а затем использовать инструкцию if для предупреждения о погоде на основе переменной @destroyed.

def destroy 
    @promotion_type = PromotionType.find(params[:id]) 

    if Promo.find_by_promotion_type_id(params[:id]).nil? 
     @deleted = true 
     @promotion_type.destroy 

     respond_to do |format| 
     format.html { redirect_to(promotion_types_url) } 
     format.js {render :layout => false } 
     format.xml { head :ok } 
     end 
    else 
     @deleted = false 
     respond_to do |format| 
     format.js {} 
     end 
    end 
end 
+0

Он работает по большей части. Но он все еще скрывает его, даже если он не удаляет его. Я не могу выбросить $ (row) .hide(); в файл .js.erb, потому что строка не определена. function (data) $ {$ (row) .hide();} скрывает строку независимо. Я не уверен, что путь (данные) есть, потому что он никогда не используется. – Mike

Смежные вопросы