Подтвердить что ты не робот

Почему действие Ruby on Rails "destroy" не называется "delete"?

Принцип CRUD определяет четыре основных операции с постоянными данными:

  • Создание,
  • Чтение,
  • Update
  • Удалить.

В HTTP-глаголах также используется слово DELETE.

Почему маршрутизация по умолчанию в Rails использует слово " destroy" для действия, соответствующего HTTP-глаголу DELETE

4b9b3361

Ответ 1

Rails использует 4 стандартных метода (глаголы), а именно:

  • GET
  • POST
  • PUT
  • DELETE

Кроме того, он имеет 7 RESTful действий:

  • Индекс
  • новый
  • создать
  • изменить
  • обновление
  • показать
  • уничтожить

Rails никогда не использует тот же самый глагол, что и соответствующее действие. Маршрутизация к действию destroy позволяет сделать больше, чем один DELETE, через соответствующее действие в контроллере.

Этот railsguide может вас заинтересовать: http://guides.rubyonrails.org/routing.html

Объяснение

Браузеры запрашивают страницы из Rails, отправляя запрос на URL-адрес с использованием определенного HTTP-метода, такого как GET, POST, PUT и DELETE. Каждый метод - это запрос на выполнение операции над ресурсом. Маршрут ресурса сопоставляет ряд связанных запросов с действиями в одном контроллере.

Теперь представьте, что у нас есть запрос HTTP GET, что означает, что вы хотите читать/извлекать данные. Если действие будет иметь то же имя, что и глагол, GET в этом случае будет слишком упрощенным. GET может предоставлять доступ к показу, индексу, новым или редактировать действия. Все они читают данные, но сами действия, безусловно, не совпадают. То же самое можно сказать и о запросе DELETE. Этот запрос обрабатывается через контроллер и может иметь разные реализации в действиях. Возможно, вы хотите уничтожить сообщение, но это может означать, что вы хотите выйти из своей пользовательской сессии. Только наличие действия с именем delete не будет оправдывать связанные с ним возможности через контроллер.

Изменить

Если вы хотите узнать больше о том, как обрабатываются запросы из браузера, вы можете прочитать некоторую информацию о модели M (odel) V (iew) C (ontroller), которую Rails использует:

http://www.youtube.com/watch?v=3mQjtk2YDkM&noredirect=1

и

http://betterexplained.com/articles/intermediate-rails-understanding-models-views-and-controllers/

Цитата из этой ссылки:

Браузер делает запрос, например http://mysite.com/video/show/15Веб-сервер (mongrel, WEBrick и т.д.) Получает запрос. Он использует маршруты, чтобы узнать, какой контроллер использовать: шаблон маршрута по умолчанию - "/controller/action/id", как определено в config/routes.rb.

Значение вашего первоначального запроса будет переведено и обработано через веб-сервер, а правильный маршрут должен быть определен через контроллер, где находится успокоительное действие, такое как destroy.

В первые дни Rails существовали только 2 глагола, а именно GET и POST (поскольку PUT и DELETE не поддерживаются, а более поздние версии рельсов разрешаются путем добавления PUT и DELETE через скрытые переменные. Имя действия destroy никогда не изменялся, поскольку запрос и действия - это две разные вещи.

Actions || show  || create || update || destroy
SQL     || select|| create || update || delete
REST    || get   || post   || post   || post

Actions || show  || create || update || destroy
SQL     || select|| create || update || delete
REST    || get   || post   || put    || delete

Эта цитата может представлять интерес:

"Поскольку маршрутизатор использует HTTP-глагол и URL-адрес для соответствия входящим запросам, четыре URL-адреса отображают семь разных действий.

http://guides.rubyonrails.org/routing.html

Ответ 2

Для части модели, вот хорошее резюме из http://www.nickpeters.net/2007/12/21/delete-vs-destroy/:

Метод удаления по существу удаляет строку (или массив строк) из базы данных. Уничтожить с другой стороны позволяет еще несколько вариантов. Во-первых, он проверяет любые обратные вызовы, такие как before_delete, или любые которые мы укажем в нашей модели. Затем он будет поддерживать объект, который только что был удален в памяти; это позволяет нам оставить сообщение с надписью "Order # {order.id} было удалено". Наконец, и самое главное, он также удалит все дочерние объекты связанные с этим объектом!

Зная, что имеет смысл назвать действие в контроллере таким же, как и в модели. Удалить слишком упрощенное.

Ответ 3

Хороший вопрос.

Мне хочется, чтобы вы всегда использовали destroy, а не delete для своих объектов.

Фактически, delete не вызывает никакого обратного вызова.

Ответ 4

Вот очень ранний (2007) ответ от Райана Бейтса

В основном "delete" отправляет запрос непосредственно в базу данных для удаления записи. В этом случае Rails не знает, какие атрибуты находятся в записи, которую он удаляет, и если есть какие-либо обратные вызовы (например, before_destroy).

Метод "destroy" принимает пройденный id, выбирает модель из базы данных с помощью метода "find", а затем вызывает уничтожение. Это означает, что вызваны обратные вызовы.

Вы хотели бы использовать "delete", если вы не хотите, чтобы вызывающие вызовы были запущены или вы хотите повысить производительность. В противном случае (и большую часть времени) вы захотите использовать "destroy".

источник