Обработка ActiveRecord :: RecordNotFound в Ruby on Rails - PullRequest
6 голосов
/ 25 июля 2011

В моем действии редактирования у меня есть

@item = current_user.shop.items.find(params[:id])

, чтобы пользователь мог редактировать только те предметы, которые принадлежат его магазину.Если они пытаются отредактировать предмет, который не принадлежит их магазину, они получают ошибку ActiveRecord :: RecordNotFound.

Каков наилучший способ обработки этой ошибки в подобных ситуациях?я должен поднять исключение?я должен перенаправить куда-нибудь и установить вспышку (если так, как я делаю это), я должен просто оставить все как есть?Любой совет приветствуется.

Спасибо

Ответы [ 3 ]

22 голосов
/ 25 июля 2011

Добавьте что-то вроде следующего к вашему контроллеру:

rescue_from ActiveRecord::RecordNotFound do
  flash[:notice] = 'The object you tried to access does not exist'
  render :not_found   # or e.g. redirect_to :action => :index
end
20 голосов
/ 30 августа 2012

+ 1 для решения @Koraktor.Если вы хотите избежать ActiveRecord :: RecordNotFound, вы можете использовать метод find_by вместо find.

@item = current_user.shop.items.find_by_id(params[:id])
if @item.nil?
  flash[:error] = "Item not found"
else
  # Process the @item...
end
4 голосов
/ 13 декабря 2014

Дополнительно вы должны установить статус http при отображении шаблона:

rescue_from ActiveRecord::RecordNotFound do
  render :not_found, :status => :not_found
end

Проверьте список направляющих (раздел 2.2.13.4).

Как указано в другом месте (например, здесь ), вы никогда не должны делать перенаправление при отправке 40-кратного статуса, только 30-кратные статусы должны разрешать перенаправление. Так что вы можете столкнуться со странной страницей «Вас перенаправляют» всякий раз, когда вы пытаетесь выполнить перенаправление со статусом: not_found.

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