2010-10-11 4 views
18

В моем контроллере разрешений, я использую Active Record, чтобы искать разрешение:Rails 3 - Как не к ошибке, если запись не найдена

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

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

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

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

Благодаря

ответ

46
@permission = Permission.find_by_id params[:user_id] 

Идея заключается в том, что если вы используете «первые из параметров является идентификатором» версия поиска, вы точно знаете, что вы ищете, а если нет, то будет проблема , Если вы используете один из более общих синтаксических синтаксисов (например, find_by_field_name), предполагается, что если его нет, это приемлемая ситуация, поэтому просто возвращайте нуль.

+2

'@permission = Permission.find_by (id: params [: user_id])' now. – hlcs

-8

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

if @permission 
    # Handle when the permission exists 
else 
    # Handle when the permission doesn't exist 
end 
+1

'ActiveRecord # find' с параметром int является целевой находкой. Rails вызывает «RecordNotFound», если запись не найдена. Это отличается от использования 'find' такими параметрами, как': first' или ': all', что больше похоже на поиск; Rails возвращает nil без записей в этих случаях. (-1 для неправильной информации, а не для тестирования) –

3

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

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

Пример:

@permission = Permission.find(:first, :id => params[:id]) 
+0

А, я забыл про 'find_by_ [column]'. Используйте это вместо этого (см. Ответ Мэтта Бриггса). Это может быть немного медленнее из-за 'method_missing', но это более интуитивно. –

2

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

@permission = Permission.find_all_by_id params[:user_id]

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

+2

Обратите внимание, что 'find_all_by_ *' будет устаревать в Rails 4. – clem

9

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

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

Смежные вопросы