Я работаю со следующей частью;
def index
@user = User.find(params[:id])
rescue
flash[:notice] = "ERROR"
redirect_to(:action => 'index')
else
flash[:notice] = "OK"
redirect_to(:action => 'index')
end
Теперь я или случай, есть ли у меня корректный идентификатор или нет, я всегда получаю "хорошо", по моему мнению, что я делаю неправильно?
Мне нужно это, когда у меня нет идентификатора в DB для показа "ОШИБКИ". Я также попытался использовать rescue ActiveRecord::RecordNotFound
но то же происходит.
Вся справка ценится.
Весь код после конца блока спасения интерпретируется, только если в блоке спасения нет возвратов. Поэтому вы можете вызвать return в конце блока спасения.
def index
begin
@user = User.find(params[:id])
rescue
flash[:notice] = "ERROR"
redirect_to(:action => 'index')
return
end
flash[:notice] = "OK"
redirect_to(:action => 'index')
end
или
def index
@user = User.find(params[:id])
# after is interpret only if no exception before
flash[:notice] = "OK"
redirect_to(:action => 'index')
rescue
flash[:notice] = "ERROR"
redirect_to(:action => 'index')
end
Но в вашем случае лучше использовать rescue_from или rescue_in_public
например
class UserController < ApplicationController
def rescue_in_public(exception)
flash[:notice] = "ERROR"
redirect_to(:action => 'index')
end
def index
@user = User.find(params[:id])
flash[:notice] = "OK"
redirect_to(:action => 'index')
end
end
Но использование rescue_in_public не совсем хороший совет
Если нет пользователя
с этим идентификатором
, то User.find
вернет nil
. Возврат nil
не является случаем ошибки и не запускает спасательную операцию
.