Вложенный ресурс не уничтожен должным образом при зависимом уничтожении

У меня возникла проблема с тем, что видео на YouTube было должным образом уничтожено во вложенных отношениях own_to has_one между проповедью и ее видео проповеди при использовании: зависимых =>: уничтожить.

Я использую гем youtube_it и имею довольно ванильную настройку.

Соответствующие биты ниже:

видеоконтроллер -

def destroy
  @sermon = Sermon.find(params[:sermon_id])
  @sermon_video = @sermon.sermon_video

  if SermonVideo.delete_video(@sermon_video)
    flash[:notice] = "video successfully deleted"
  else
    flash[:error] = "video unsuccessfully deleted"
  end
  redirect_to dashboard_path
end

модель видео -

belongs_to :sermon

def self.yt_session
  @yt_session ||= YouTubeIt::Client.new(:username => YouTubeITConfig.username , :password => YouTubeITConfig.password , :dev_key => YouTubeITConfig.dev_key)
end

def self.delete_video(video)
  yt_session.video_delete(video.yt_video_id)
  video.destroy
    rescue
      video.destroy
end

модель проповеди -

has_one :sermon_video, :dependent => :destroy

accepts_nested_attributes_for :sermon_video, :allow_destroy => true

В приведенной выше настройке все локальные данные удаляются успешно; Однако видео на YouTube нет.

Я попытался переопределить действие уничтожения с помощью метода в модели, но, вероятно, из-за нехватки моего понимания, можно удалить только видео из YouTube или удаленную запись, но не оба одновременно (я разместил два варианта ниже и их результаты).

Это служит только для уничтожения локальной записи -

def self.destroy
  @yt_session ||= YouTubeIt::Client.new(:username => YouTubeITConfig.username , :password => YouTubeITConfig.password , :dev_key => YouTubeITConfig.dev_key)
  @yt_session.video_delete(self.yt_video_id)

  @sermon_video.destory
end

Это служит только для уничтожения видео на YouTube, но не локального ресурса -

def self.destroy
  @yt_session ||= YouTubeIt::Client.new(:username => YouTubeITConfig.username , :password => YouTubeITConfig.password , :dev_key => YouTubeITConfig.dev_key)
  @yt_session.video_delete(self.yt_video_id)
end

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

<%= link_to "Delete", [@sermon.church, @sermon], :method => :delete %>

Спасибо за вашу помощь, очень признателен!

1 ответ

Решение

Похоже, я только что решил проблему; однако, я оставлю это открытым на некоторое время, если у кого-то есть более элегантное / подходящее решение.

В модели видео проповеди я добавил -

before_destroy :kill_everything

def kill_everything
  @yt_session ||= YouTubeIt::Client.new(:username => YouTubeITConfig.username , :password => YouTubeITConfig.password , :dev_key => YouTubeITConfig.dev_key)
  @yt_session.video_delete(self.yt_video_id)
end

И главное, что я добавил в модель проповеди, было это -

accepts_nested_attributes_for :sermon_video, :allow_destroy => true
Другие вопросы по тегам