Ответ 1
Рельсы никоим образом не согласуются в использовании исключений. find
вызовет исключение, если объект не найден, но для сохранения вы можете выбрать, какое поведение вы хотите. Наиболее распространенная форма:
if something.save
# formulate a reply
else
# formulate an error reply, or redirect back to a form, or whatever
end
то есть. save
возвращает true или false. Но есть также save!
, который вызывает исключение (добавление восклицательного знака в конец имени метода - это рубизм, показывающий, что метод "опасен" или разрушителен или просто имеет побочные эффекты, точную значение зависит от контекста).
Существует веская причина, почему find
вызывает исключение: if a RecordNotFound
исключение пузырьков до верхнего уровня, это вызовет рендеринг страницы 404. Поскольку вы обычно не используете эти исключения вручную (редко, вы видите rescue ActiveRecord::RecordNotFound
в приложении Rails), вы получаете эту функцию бесплатно. В некоторых случаях, однако, вы хотите что-то сделать, когда объект не существует, и в этих случаях вам нужно поймать исключение.
Я не думаю, что термин "наилучшая практика" на самом деле означает что-то, но мой опыт показывает, что исключения больше не используются для контроля потока в Ruby, чем в Java или любом другом языке, который я использовал. Учитывая, что Ruby не имеет проверенных исключений, вы имеете дело с исключениями гораздо меньше в целом.
В конце концов, до интерпретации. Поскольку наиболее распространенным вариантом использования для find
является получение объекта для его отображения и что URL-адрес для этого объекта будет сгенерирован приложением, это может быть исключительным обстоятельством, что объект не может быть найден. Это означает, что либо приложение генерирует ссылки на объекты, которые не существуют, либо что пользователь вручную редактировал URL-адрес. Также может быть, что объект был удален, но ссылка на него все еще существует в кеше или через поисковую систему, я бы сказал, что это тоже исключительное обстоятельство.
Этот аргумент применяется к find
при использовании как в вашем примере, то есть с идентификатором. Существуют и другие формы find
(включая многие варианты find_by_*
), которые фактически выполняют поиск, и те, которые не создают исключений (а затем в Rails 3 есть where
, что заменяет многие из использования find
в Rails 2).
Я не хочу сказать, что использование исключений, таких как управление потоком, - это хорошо, но это не обязательно неправильно, что find
вызывает исключения и что ваш конкретный вариант использования - не обычный случай.