Должно ли удаление несуществующего ресурса привести к 404 в RESTful Rails? - PullRequest
15 голосов
/ 25 июня 2011

В новом приложении Rails с моделью RESTful в скаффолдах сгенерированный код удаления выглядит следующим образом:

class BeersController < ApplicationController
  # DELETE /beers/1
  # DELETE /beers/1.xml
  def destroy
    @beer = Beer.find(params[:id])
    @beer.destroy

    respond_to do |format|
      format.html { redirect_to(beers_url) }
      format.xml  { head :ok }
    end
  end
end

Если пользователь пытается удалить одно и то же пиво дважды (возможно, быстрый двойной щелчок,или действия в двух разных вкладках браузера) они получат ошибку RecordNotFound, в результате чего страница 404.Это довольно недружелюбный опыт;кажется, что было бы лучше завершить перенаправление обратно на beers_url независимо, возможно, с ошибкой flash, так как на самом деле пользователь ничего не может поделать с ошибкой второго удаления.

Anальтернативный подход заключается в том, чтобы в любом случае действовать так, как будто удаление завершилось удачно:

def destroy
  @beer = Beer.find_by_id(params[:id])
  destroyed = @beer.try(:destroy)        

  respond_to do |format|
    format.html { redirect_to(beers_url) }
    format.xml  { destroyed ? head(:ok) : head(:not_found) }
  end
end

Я могу понять стремление к серьезной ошибке 404 в сценарии использования API, но мне труднее оправдатьвеб приложение.Может ли кто-нибудь предоставить вескую причину, почему мы должны выдавать страшную ошибку пользователю во имя RESTfulness?

(Этот вопрос не относится к Rails, но я не знаю, как другие фреймворки справляются с этим случаемиз коробки).

Ответы [ 4 ]

7 голосов
/ 19 мая 2013

ОБНОВЛЕНИЕ : Оказывается, я ошибался: https://stackoverflow.com/a/24713946/14731


Предыдущий ответ : HTTP DELETE является идемпотентом операция.Вызов его несколько раз подряд должен привести к тому же поведению, что и первый.Значение: вы не должны возвращать HTTP 404 .

4 голосов
/ 25 июня 2011

Я не думаю, что вам следует когда-либо выдавать ошибку пользователю ради поддержания какого-то стандарта, особенно если это приложение, ориентированное на потребителя (в отличие от B2B).Но вы также не должны заставлять свой API изменять свой код состояния только для этой одной ситуации.Ресурс больше не существует;таким образом, 404 - это правильный ответ.

Я думаю, что здесь есть путь наименьшего (или арендодатель - это даже слово ???) сопротивления.Я еще не изучал ruby, поэтому не могу предоставить полезную реализацию;но у меня есть некоторый опыт работы с веб-приложениями, использующими html / css / js.

Если есть какая-то законная проблема с пользователями, нажимающими кнопку дважды;почему бы не настроить кнопку таким образом, чтобы она отключалась при отправке запроса и повторно включалась, когда выполнялись соответствующие условия (запрос возвращался)?Другими словами, избегайте логики if (это очень специфическая ситуация), делая невозможным попадание в ситуацию, которую вы видите.Я предполагаю, что у ruby ​​есть что-то специально для обработки запросов и добавления обработчиков функций для разных кодов состояния;или, по крайней мере, не 200 кодов состояния.

2 голосов
/ 25 июня 2011

Rails-код скаффолда - в лучшем случае предложение.Ваш инстинкт сделать сообщение об ошибке более удобным для пользователя - хороший.

1 голос
/ 25 июня 2011

Нет причин, по которым вы не можете вернуть красиво отформатированную страницу 404 с вашим ответом.Код состояния может быть таким же, только рендеринг более удобен для пользователя, чем ваша обычная страница 404.Вы даже можете вернуть «перенаправленную» страницу в теле ответа.Одной из возможных проблем является поддержка браузера.Прошло довольно много лет, но я, кажется, вспоминаю, что IE (6?) Полностью игнорировал содержание тела ответа при получении 404. Вам придется поэкспериментировать, чтобы увидеть, что работает лучше для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...