Можно ли сделать следующее:
if @user = User.friendly.find(params[:id])
// logic here
else
// do something if user doesn't exist
end
По какой-то причине это вызывает следующую ошибку:
ActiveRecord::RecordNotFound
Можно ли сделать следующее:
if @user = User.friendly.find(params[:id])
// logic here
else
// do something if user doesn't exist
end
По какой-то причине это вызывает следующую ошибку:
ActiveRecord::RecordNotFound
[] RecordNotFound [исключение возникает, если] ни одна запись не ответила на метод
find
. Либо строка с данным идентификатором не существует, либо строка не соответствует дополнительным ограничениям. Некоторые вызовы поиска [например, методыfind_by*
] не вызывают это исключение, чтобы сигнализировать о том, что ничего не найдено.
Используйте find_by_id
(или find_by
), который вернет nil
, если элемент не найден:
friendly.find_by_id params[:id]
friendly.find_by id: params[:id]
См. также: Rails находит получение ActiveRecord::RecordNotFound
Как было предложено в Rails находит получение ActiveRecord::RecordNotFound, я бы использовал begin/end, потому что .find
должен вызвать исключение:
begin
@user = User.friendly.find(params[:id])
# rest of code...
rescue ActiveRecord::RecordNotFound => e
# other code; @user will automatically be nil since unassigned
end
Но на самом деле это вопрос личных предпочтений.
find
или find_by_id
?
- person Hopstream; 29.12.2013
find
быстрее. Я сделал тест производительности на обоих 10 раз. find
заняло в среднем 0,001148 секунды, find_by_id
заняло в среднем 0,001741 секунды.
- person weltschmerz; 29.12.2013
return false
внутри блока восстановления, чтобы остановить метод контроллера, или, более элегантно, redirect_to some_path and return false
- person weltschmerz; 29.12.2013