Вложенный ресурс не уничтожен должным образом при зависимом уничтожении
У меня возникла проблема с тем, что видео на 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