Rails 3 - Как не ошибиться, если запись не найдена - PullRequest
21 голосов
/ 12 октября 2010

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

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

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

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

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

Спасибо

Ответы [ 5 ]

48 голосов
/ 12 октября 2010
@permission = Permission.find_by_id params[:user_id]

Идея состоит в том, что если вы используете версию find "first param is id", вы точно знаете, что ищете, и если ее там нет, то это проблема. Если вы используете один из более общих синтаксисов поиска (например, find_by_field_name), предполагается, что если его там нет, это приемлемая ситуация, поэтому просто верните nil.

9 голосов
/ 20 октября 2012

Я знаю, что это старо, но я только что нашел это, и я хочу предложить другой способ справиться с этой ситуацией.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 голосов
/ 12 октября 2010

ActiveRecord#find с параметром int - это целевая находка.Rails вызывает RecordNotFound, если запись не найдена.

Это отличается от использования find с такими параметрами, как :first или :all, что является скорее поиском;Rails возвращает ноль без записей в этих случаях.Если вы хотите избежать возникновения исключения, используйте один из этих параметров или соответствующие имена методов.

Пример:

@permission = Permission.find(:first, :id => params[:id])
2 голосов
/ 28 мая 2012

Другой способ:

@permission = Permission.find_all_by_id params[:user_id]

Я думаю, что это полезно, если user_id это массив

0 голосов
/ 12 октября 2010

Я думаю, что это будет работать, я не проверял это.

if @permission
  # Handle when the permission exists
else
  # Handle when the permission doesn't exist
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...