Почему не делают люди переносятся, начинают/спасают блоки вокруг ActiveRecord.find в направляющих?

Если пользователь пытается отправить форму или получить доступ к сервису, который использует что-то, такое как следующая нижняя часть капот:

Model.find(params[:id]) # if model does not exist, throw ActiveRecord::RecordNotFound

Если экземпляр не может быть найден, исключение выдается. Все же я редко вижу, что люди переносят тот оператор в начать/спасти блоке, даже если Вы создаете леса, генератор направляющих не переносится, находка призывают, начинают/спасают блоки.

Существует ли причина этого?

0
задан randombits 29 July 2010 в 21:14
поделиться

5 ответов

Я думаю, это потому, что самый распространенный случай - если вы ищете объект по id, а его не существует, то это исключение. Исключение всплывет, и rails обработает его как 404 для вас, что обычно уместно.

Если это ситуация, когда объект может существовать, а может и не существовать, то либо перехват исключения, либо использование Model.find_by_id(params[:id]) и проверка на нулевой объект работают отлично.

4
ответ дан 4 September 2019 в 00:48
поделиться

, потому что проще вызвать:

Model.find_by_id(params[:id])

Что возвращает ноль, если запись не найдена

0
ответ дан 4 September 2019 в 00:48
поделиться

Потому что вы хотите преждевременно выйти из строя . Чем раньше вы обнаружите, что что-то не так, тем скорее вы сможете это исправить.

0
ответ дан 4 September 2019 в 00:48
поделиться

Одна из причин может заключаться в том, что логика обработки ошибок передается обработчикам восстановления в приложении.

ваш контроллер:

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 для объяснения)

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

Лично я не видел слишком много кода, который не выполняет хотя бы базовую проверку. Я бы сказал, что это в некоторой степени культурная вещь: если вы не создаете маршрут, который вызовет ошибку, вы не обязаны ее обрабатывать. Очевидно, это далеко от идеала, но я думаю, что это не является приоритетом для многих разработчиков. Это в основном зависит от бизнес-логики: обычно она положительно ориентирована, то есть предполагает только ответ на допустимые действия пользователя.

2
ответ дан 4 September 2019 в 00:48
поделиться

Я видел такой код:

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
0
ответ дан 4 September 2019 в 00:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: