2009-05-27 3 views
2

Я собираю ссылки PUT/DELETE, a la Rails, которые при нажатии создают форму POST со скрытым вводом, обозначенным _method, который отправляет предполагаемый тип запроса. Я хочу сделать его DRYer, но мои знания jQuery не соответствуют этому.DRY jQuery для RESTful PUT/DELETE ссылки

HTML:

<a href="/articles/1" class="delete">Destroy Article 1</a> 
<a href="/articles/1/publish" class="put">Publish Article 1</a> 

JQuery:

$(document).ready(function() { 

    $('.delete').click(function() { 
    if(confirm('Are you sure?')) { 
     var f = document.createElement('form'); 
     $(this).after($(f).attr({ 
     method: 'post', 
     action: $(this).attr('href') 
     }).append('<input type="hidden" name="_method" value="DELETE" />')); 
     $(f).submit(); 
    } 
    return false; 
    }); 

    $('.put').click(function() { 
    var f = document.createElement('form'); 
    $(this).after($(f).attr({ 
     method: 'post', 
     action: $(this).attr('href') 
    }).append('<input type="hidden" name="_method" value="PUT" />')); 
    $(f).submit(); 
    return false; 
    }); 

}); 

ответ

8

Хорошо, так что я наконец-то испытал это. Он делает то, что он утверждает на коробке.

$(document).ready(function() { 

    $.fn.getClassInList = function(list){ 
     for(var i = 0; i < list.length; i++) 
     { 
      if($(this).hasClass(list[i])) 
      return list[i]; 
     } 
     return ""; 
    } 

    $('.delete,.put').click(function() { 
    if(confirm('Are you sure?')) { 
     var f = document.createElement('form'); 
     $(this).after($(f).attr({ 
     method: 'post', 
     action: $(this).attr('href') 
     }).append('<input type="hidden" name="_method" value="' 
      + $(this).getClassInList(['put', 'delete']).toUpperCase() 
      + '" />')); 
     $(f).submit(); 
    } 
    return false; 
    }); 

}); 
+0

Хотя, вы ограничиваете возможность стилизовать его с другими классами. – Stobor

+0

Согласовано со Стобор. Спасибо хоть. – Aupajo

+0

Хорошо, поэтому я исправил его так, чтобы он работал с несколькими классами, поэтому его можно нормально использовать ... – Stobor

-2

Забудьте о своем скрытом поле и просто измените способ установки или удаления. Я хотел бы выбрать форму, вместо того, чтобы создавать его, то просто изменить атрибуты

$ («форма»). Атр («метод», «положить»). Представить()

+0

Не будет ли это работать, только если браузер поддерживает запросы PUT/DELETE? – Aupajo

+0

Ну да, но это не было требованиями и не было обработкой его на стороне сервера, что не было бы истинным REST, в первую очередь, тогда этого не было. –

+0

Я использую поле _method в качестве обходного пути. Сервер будет интерпретировать его как запрос псевдо-PUT. – Aupajo

5

Вы можете просто использовать формы вместо ссылки и пусть jQuery form plugin обрабатывать представление, если вы хотите использовать Ajax:

<form class="delete" method="post" action="/articles/1"> 
    <input type="hidden" name="_method" value="delete"/> 
    <button type="submit">Delete</button> 
</form> 

JQuery:

$(document).ready(function() { 
    $('form.delete').ajaxForm(options); 
}); 

переменная опции может содержать до и после отправки обратных вызовов.

Стиль ваших кнопок, как ссылки, если это то, что вам нужно.

+0

Хм, спасибо, но мне не нравится дополнительная разметка. Только после того, что у меня выше, но DRYer. – Aupajo

+1

Выполнение этого способа: следует за СУХОЙ мантрой как можно короче, семантически корректно, так как большинство форм в Интернете сделаны, т.е. KISS (дополнительная аббревиатура), и использует прогрессивное улучшение (работает без javascript). Все это для небольшой дополнительной разметки. – rojoca

+0

Не должна ли эта кнопка вводить тип = "submit" или что-то для этой формы работать без javascript? – Svish

-1

Я просто проверял следующее, и она работала для меня:

$(function() { 
    $('.post, .POST').click(function() { 
    $('<form method="POST" style="display:none"><input type="hidden" name="_method" value="POST" /></form>') 
     .insertAfter($(this)) 
     .attr({ 
     action: $(this).attr('href') 
     }).submit(); 
    return false; 
    }); 
    $('.put, .PUT').click(function() { 
    $('<form method="POST" style="display:none"><input type="hidden" name="_method" value="PUT" /></form>') 
     .insertAfter($(this)) 
     .attr({ 
     action: $(this).attr('href') 
     }).submit(); 
    return false; 
    }); 
    $('.delete, .DELETE').click(function() { 
    if(confirm('Are you sure?')) { 
     $('<form method="POST" style="display:none"><input type="hidden" name="_method" value="DELETE" /></form>') 
     .insertAfter($(this)) 
     .attr({ 
      action: $(this).attr('href') 
     }).submit(); 
    } 
    return false; 
    }); 
}); 

Какие проблемы, где вы иметь?

+0

Просто пытаюсь сделать это DRYer. – Aupajo

+1

Сколько раз вы R yourslf на этом посту? –

+0

Я неправильно понял исходный вопрос и подумал, что опубликованный код не работает. Вместо этого первоначальный плакат стремился упростить реализацию. Я бы не назвал это DRYer, но вместо этого просто проще. Вы все еще указываете только важный материал (ссылка должна быть PUT) только один раз. DRY (Do not Repeat Yourself) - это в первую очередь об одной истине в информации о конфигурации. Вы продаете немного сложного кода рамки, так что вам нужно только указать информацию о конфигурации один раз. Таким образом, сложность обработчиков, которые у меня здесь, не имеет большого значения. –