Если пользователь пытается отправить форму или получить доступ к сервису, который использует что-то, такое как следующая нижняя часть капот:
Model.find(params[:id]) # if model does not exist, throw ActiveRecord::RecordNotFound
Если экземпляр не может быть найден, исключение выдается. Все же я редко вижу, что люди переносят тот оператор в начать/спасти блоке, даже если Вы создаете леса, генератор направляющих не переносится, находка призывают, начинают/спасают блоки.
Существует ли причина этого?
Я думаю, это потому, что самый распространенный случай - если вы ищете объект по id, а его не существует, то это исключение. Исключение всплывет, и rails обработает его как 404 для вас, что обычно уместно.
Если это ситуация, когда объект может существовать, а может и не существовать, то либо перехват исключения, либо использование Model.find_by_id(params[:id])
и проверка на нулевой объект работают отлично.
, потому что проще вызвать:
Model.find_by_id(params[:id])
Что возвращает ноль, если запись не найдена
Потому что вы хотите преждевременно выйти из строя . Чем раньше вы обнаружите, что что-то не так, тем скорее вы сможете это исправить.
Одна из причин может заключаться в том, что логика обработки ошибок передается обработчикам восстановления в приложении.
ваш контроллер:
def some_action
@foo = Foo.find!(params[:id])
# Exception will raise here ...
# ...
end
, а затем укажите
rescue_from ActiveRecord::RecordNotFound, :some_method_that_will_render_a_404
(см. this для объяснения)
Эшафоты - это просто ярлыки для быстрого запуска чего-либо, но как эмпирическое правило леса не предназначены для того, чтобы дожить до производства .
Лично я не видел слишком много кода, который не выполняет хотя бы базовую проверку. Я бы сказал, что это в некоторой степени культурная вещь: если вы не создаете маршрут, который вызовет ошибку, вы не обязаны ее обрабатывать. Очевидно, это далеко от идеала, но я думаю, что это не является приоритетом для многих разработчиков. Это в основном зависит от бизнес-логики: обычно она положительно ориентирована, то есть предполагает только ответ на допустимые действия пользователя.
Я видел такой код:
def add_to_cart
begin
product = Product.find(params[:id])
rescue ActiveRecord::RecordNotFound
logger.error("Attempt to access invalid product #{params[:id]}")
redirect_to_index("Invalid product")
else
@cart = find_cart
@cart.add_product(product)
end
end