Как я могу пропустить ошибку, если find ничего не возвращает в rails? - PullRequest
14 голосов
/ 24 марта 2011

Я пытаюсь создать систему, в которой пользователь может видеть только те статьи, которые он или она написал.

В контроллере статей я ставлю строку

@article = current_user.articles.find(params[:id])

где params [: id] является article_id.

Я просто хочу знать, как можно пропустить ошибку при отображении и просто перенаправить на действие: index, если статья не существует или если у пользователя нет разрешения на ее просмотр.Я положил @ article.nil?условный оператор после вышеупомянутого оператора find, но кажется, что приведенный выше оператор find немедленно выдает ошибку, как показано ниже.

Не удалось найти статью с ID = 1662 [WHERE (articles .user_id = 1)]

Как я могу решить эту проблему?

Ответы [ 4 ]

22 голосов
/ 24 марта 2011

ActiveRecord :: Base.find всегда выдает исключение, если не находит записи, это сделано намеренно.Вам следует использовать find, только если вы абсолютно уверены, что получите то, что ищете.Если вы отменяете действие шоу и не можете найти статью, вы должны спасти это исключение и отобразить 404 (не найдено) вместо перенаправления на индекс (технически).

Если вы хотите найти что-то по атрибуту id без принудительного исключения, используйте динамический искатель find_by_id, который вернет false, если не найдет запись с этим идентификатором.

Редактировать:

Динамические искатели теперь имеют другую подпись, find_by_id теперь должно быть:

find_by :id, id_to_find

См. Новый Руководство по рельсам для запросов

4 голосов
/ 24 марта 2011

Вы должны использовать find_by_id или любой из методов, приведенных в этом вопросе .

2 голосов
/ 24 марта 2011

Это связано с тем, что метод поиска ActiveRecord вызывает исключение, когда не может найти определенный идентификатор.Вы можете решить эту проблему несколькими способами, лучше всего, кажется,

begin
  @article = current_user.articles.find(params[:id])
rescue
  redirect_to articles_path
end
1 голос
/ 24 марта 2011

Метод find () вызывает исключение RecordNotFound, в то время как такие методы, как find_by_id, возвращают значение nil. Таким образом, у вас есть пара опций, в которые вы можете заключить вызов вашего метода с помощью begin / rescue, добавив блок rescue_from в ваш контроллер:

rescue_from(ActiveRecord::RecordNotFound) {|e| do something here }

или используйте метод find_by_id и обработайте условие, при котором возвращается nil.

На самом деле есть ряд других альтернатив, но приведенные выше - хорошее начало, вероятно, find_by_id - самый простой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...