Не вызывайте ActiveRecord :: RecordNotFound, если вложенные атрибуты, помеченные для уничтожения, не существуют - PullRequest
2 голосов
/ 20 марта 2020

Я использую вложенные атрибуты Rails с allow_destroy: true. Если я вызываю что-то вроде этого:

deck.update(deck_items_attributes: { id: 1000, _destroy: true })

и deck_item с идентификатором 1000 не существует, Rails вызывает исключение ActiveRecord::RecordNotFound.

Есть ли способ сообщить Rails не выбросить исключение и просто проигнорировать эту запись?

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Используйте опцию reject_if:, чтобы удалить атрибуты ha sh, если запись не существует:

accepts_nested_attributes_for :deck_items,
   reject_if: :deck_item_does_not_exist?

private
def deck_item_does_not_exist?(attributes)
  if attributes["id"].present? && attributes["_destroy"].present? 
    DeckItem.where(id: attributes["id"]).none?
  else
    false
  end
end
0 голосов
/ 20 марта 2020

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

begin
  deck.update(deck_items_attributes: { id: 1000, _destroy: true })
rescue ActiveRecord::RecordNotFound => e
  puts custom_error_msg
end
...