Rails 3 - Как не ошибиться, если запись не найдена
В моем контроллере разрешений я использую Active record для поиска разрешения:
@permission = Permission.find(params[:user_id])
Если это вернет результат, я затем просмотрю имя permission.name и передаю это моему контроллеру.
Проблема в том, что иногда это возвращает результат, в других случаях это не так. Когда это не так, это ошибки. Как я могу предотвратить это?
Случай использования:
1. Если у пользователя есть запись разрешения, покажите его и позвольте пользователю изменить его
2. Если нет, покажите, что у них нет записи разрешений и разрешить пользователю устанавливать разрешение.
Спасибо
Ответы
Ответ 1
@permission = Permission.find_by_id params[:user_id]
Идея заключается в том, что если вы используете версию поиска "first param is id", вы точно знаете, что ищете, и если ее нет, это проблема. Если вы используете один из более общих синтаксических элементов поиска (например, find_by_field_name), предположение состоит в том, что если его нет, это приемлемая ситуация, поэтому просто возвращаем нуль.
Ответ 2
Я знаю, что это старо, но я только что нашел это, и я хочу предложить другой способ справиться с этой ситуацией. ActiveRecord::RecordNotFound
нечего бояться. Пользователь может передать допустимый идентификатор записи, но эта запись может не принадлежать им (т.е. Если вы делаете что-то вроде current_user.widgets.find(params[:id])
). Я предпочитаю обрабатывать его следующим образом:
def show
begin
@permission = Permission.find(params[:user_id])
rescue ActiveRecord::RecordNotFound
# however you want to respond to it
end
end
Ответ 3
ActiveRecord#find
с параметром int является целевой находкой. Rails повышает значение RecordNotFound, если запись не найдена.
Это отличается от использования find с такими параметрами, как :first
или :all
, что больше похоже на поиск; Rails возвращает nil без записей в этих случаях. Если вы хотите избежать возникновения исключения, используйте один из этих параметров или соответствующие имена методов.
Пример:
@permission = Permission.find(:first, :id => params[:id])
Ответ 4
Другой способ:
@permission = Permission.find_all_by_id params[:user_id]
Я думаю, что это полезно, если user_id - это массив
Ответ 5
Я думаю, что это сработает, я его не тестировал.
if @permission
# Handle when the permission exists
else
# Handle when the permission doesn't exist
end