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