Подтвердить что ты не робот

Rails 3 - Как не ошибиться, если запись не найдена

В моем контроллере разрешений я использую Active record для поиска разрешения:

@permission = Permission.find(params[:user_id])

Если это вернет результат, я затем просмотрю имя permission.name и передаю это моему контроллеру.

Проблема в том, что иногда это возвращает результат, в других случаях это не так. Когда это не так, это ошибки. Как я могу предотвратить это?

Случай использования: 1. Если у пользователя есть запись разрешения, покажите его и позвольте пользователю изменить его 2. Если нет, покажите, что у них нет записи разрешений и разрешить пользователю устанавливать разрешение.

Спасибо

4b9b3361

Ответ 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