В новом приложении 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, но я не знаю, как другие фреймворки справляются с этим случаемиз коробки).