0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Удаление - самое простое действие в обычном CRUD. Ему не нужен шаблон, все удаление состоит из простого обработчика, в котором даже нет условных конструкций.</p>
1
<p>Удаление - самое простое действие в обычном CRUD. Ему не нужен шаблон, все удаление состоит из простого обработчика, в котором даже нет условных конструкций.</p>
2
<p>Маршрут:</p>
2
<p>Маршрут:</p>
3
<p>Обработчик:</p>
3
<p>Обработчик:</p>
4
<p>Самое интересное в удалении - это ссылка или кнопка удаления. Она не может быть обычной ссылкой. Почему? Потому что, с точки зрения HTTP, удаление это DELETE-запрос. Эту семантику важно соблюдать, так как на нее ориентируются разные инструменты и поисковики при анализе страниц. Если сделать удаление обычной ссылкой, то любой автоматический инструмент может попробовать перейти по ней (например предзагрузка страниц в chrome). Это будет крайне неприятный сюрприз.</p>
4
<p>Самое интересное в удалении - это ссылка или кнопка удаления. Она не может быть обычной ссылкой. Почему? Потому что, с точки зрения HTTP, удаление это DELETE-запрос. Эту семантику важно соблюдать, так как на нее ориентируются разные инструменты и поисковики при анализе страниц. Если сделать удаление обычной ссылкой, то любой автоматический инструмент может попробовать перейти по ней (например предзагрузка страниц в chrome). Это будет крайне неприятный сюрприз.</p>
5
<p>Как минимум для разрешения подобных ситуаций нужно использовать атрибут<em>rel</em>:</p>
5
<p>Как минимум для разрешения подобных ситуаций нужно использовать атрибут<em>rel</em>:</p>
6
<p>Но этого недостаточно для отправки DELETE-запроса. Правильно реализовать эту ссылку формой, которая не отправляет никаких данных, но шлет верный запрос. В принципе так и можно поступить, но возникает странная ситуация. Само удаление содержит меньше кода чем кнопка по удалению. Да и шаблоны становятся очень грязными.</p>
6
<p>Но этого недостаточно для отправки DELETE-запроса. Правильно реализовать эту ссылку формой, которая не отправляет никаких данных, но шлет верный запрос. В принципе так и можно поступить, но возникает странная ситуация. Само удаление содержит меньше кода чем кнопка по удалению. Да и шаблоны становятся очень грязными.</p>
7
<p>Избежать ручного создания такой формы можно с помощью библиотеки<a>jquery-ujs</a>, которая изначально была написана для Rails, но не ограничена этим фреймворком. Эта библиотека написана на JS и подключается во фронтенд-части. Она опирается на data-атрибуты и сама превращает в форму все что ее попросят. Для ее установки, наберите в директории проекта:</p>
7
<p>Избежать ручного создания такой формы можно с помощью библиотеки<a>jquery-ujs</a>, которая изначально была написана для Rails, но не ограничена этим фреймворком. Эта библиотека написана на JS и подключается во фронтенд-части. Она опирается на data-атрибуты и сама превращает в форму все что ее попросят. Для ее установки, наберите в директории проекта:</p>
8
<p>Затем добавьте в конец файла<em>resources/js/app.js</em>строчки:</p>
8
<p>Затем добавьте в конец файла<em>resources/js/app.js</em>строчки:</p>
9
<p>И запустите сборку фронтенда:</p>
9
<p>И запустите сборку фронтенда:</p>
10
<p>Теперь попробуем использовать эту библиотеку:</p>
10
<p>Теперь попробуем использовать эту библиотеку:</p>
11
<p>Библиотека подключенная к странице, проанализирует все ссылки с нужными data-атрибутами и превратит их в формы отправляющие указанные запросы. Эти запросы могут быть любыми, хоть DELETE, хоть PATCH.</p>
11
<p>Библиотека подключенная к странице, проанализирует все ссылки с нужными data-атрибутами и превратит их в формы отправляющие указанные запросы. Эти запросы могут быть любыми, хоть DELETE, хоть PATCH.</p>
12
<p>Кроме того, с ее помощью можно блокировать кнопки и вызывать подтверждение:</p>
12
<p>Кроме того, с ее помощью можно блокировать кнопки и вызывать подтверждение:</p>
13
<h2>Зависимости</h2>
13
<h2>Зависимости</h2>
14
<p>В реальной жизни удаление не такая простая операция. Обычно сущности не существуют сами по себе, у них есть зависимости. Например, у статьи есть комментарии, а у курса - уроки. Как должна вести себя система при удалении родительской сущности? Что делать с зависимостями?</p>
14
<p>В реальной жизни удаление не такая простая операция. Обычно сущности не существуют сами по себе, у них есть зависимости. Например, у статьи есть комментарии, а у курса - уроки. Как должна вести себя система при удалении родительской сущности? Что делать с зависимостями?</p>
15
<p>Ответ будет разный для разных проектов и разных сущностей. Иногда нужно все удалить, иногда разорвать связи. В более сложных ситуациях удалять нельзя вообще и тогда используется "мягкое удаление". При таком подходе сущность просто помечается как удаленная и не выводится на сайте, но всегда есть возможность ее восстановить.</p>
15
<p>Ответ будет разный для разных проектов и разных сущностей. Иногда нужно все удалить, иногда разорвать связи. В более сложных ситуациях удалять нельзя вообще и тогда используется "мягкое удаление". При таком подходе сущность просто помечается как удаленная и не выводится на сайте, но всегда есть возможность ее восстановить.</p>