PUT і PATCH - це два HTTP-методи, які використовуються для оновлення ресурсів на сервері у контексті
RESTful веб-служб. Основна різниця між ними полягає в тому, як вони взаємодіють з існуючими ресурсами.
PUT (Заміна об'єкту)
Запит PUT вказує на те, що клієнт відправляє нове представлення ресурсу, яке повинно повністю замінити поточний стан ресурсу або створити новий, якщо його не існує. Іншими словами, весь ресурс повинен бути замінений новим.
Ruby on Rails приклад:
# Контролер
def update
@user = User.find(params[:id])
if @user.update(user_params)
render json: @user
else
render json: @user.errors, status: :unprocessable_entity
end
end
У цьому прикладі,
update використовується з PUT-запитом, і
@user.update(user_params) замінює всі атрибути користувача новими значеннями, які надходять з клієнта. Мається на увазі те що
user_params - містять всі параметри об'єкту (моделі).
PATCH (часткове оновлення)
Запит PATCH вказує, що клієнт відправляє часткове оновлення ресурсу, тобто тільки ті дані, які потрібно змінити, без необхідності відправляти всю інформацію про ресурс. Це зручно, коли клієнт хоче оновити лише певні поля ресурсу. Наприклад - тільки одну секцію форми інформації про себе на сайті.
Ruby on Rails приклад:
# Контролер
def update
@user = User.find(params[:id])
if @user.update(user_partial_params)
render json: @user
else
render json: @user.errors, status: :unprocessable_entity
end
end
Тут @user.update(user_partial_params) використовується для часткового оновлення користувача за допомогою PATCH-запиту, де user_partial_params містить лише ті поля, які потрібно оновити.
Узагальнюючи, PUT використовується для повного оновлення ресурсу, тоді як PATCH використовується для часткового оновлення, дозволяючи зберігати інші частини ресурсу незмінними.
Ruby on Rails доволі розумний фреймворк і він сам визначає який запит йому потрібно робити. Це дозволяє автоматизувати і впростити логіку контролера і робить код більш чистим та зрозумілим.
Тобто технічно виклик
@user.update(user_params) (який ми розгядали до цього як PUT) може бути PATCH а не PUT, через те що форма на фронтенді має не всі поля об'єкту.