Вложенный ресурс уничтожается, но соответствующая модель должна это предотвратить (проверка в Rails 5) - PullRequest
0 голосов
/ 09 июля 2019

У меня есть класс TimeWorked с отношением has_one (один или ноль) с Event

Event манипулируется в моем контроллере как nested_resource TimeWorked и отлично работает для создания и обновления.

Я положил проверку на TimeWorked, чтобы предотвратить изменение (обновление или уничтожение), когда объект подписан (окончательный вариант).

Я следовал за всеми обновленными ответами (так как Rails 5 изменил способ работы chain_halted), я мог найти здесь на SO.

Пока я могу предотвратить разрушение или обновление моей основной модели TimeWorked, но даже с throw(:abort) ActiveRecord все еще уничтожает связанный с ней ресурс TimeWorkedEvent.

Как я могу предотвратить уничтожение этой модели И ее вложенного ресурса?

Модели (TimeWorked / Event / Join table):

class TimeWorked < ApplicationRecord
  has_one :time_worked_event, dependent: :destroy
  has_one :event, through: :time_worked_event
  accepts_nested_attributes_for :time_worked_event, reject_if: proc {|att| att[:event_id].blank?}

  # cannot destroy timeworked that has been signed
  before_destroy do
     not_signed
     throw(:abort) if errors.present?
  end

 def not_signed
    errors.add(:signed, "Cannot modify or destroy a signed timeworked") if signed_exist?
  end

end

class Event < ApplicationRecord
end

class TimeWorkedEvent < ApplicationRecord
  belongs_to :event
  belongs_to :time_worked
  validates_presence_of :event
  validates_presence_of :time_worked
  validates_uniqueness_of :time_worked_id
end

Контроллер:

class TimeWorkedController < ApplicationController
 def destroy
    @time_worked.destroy
  end
end

1 Ответ

1 голос
/ 09 июля 2019

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

  before_destroy :check, prepend: true

  def check
    not_signed
    throw(:abort) if errors.present?
  end

...