嵌套资源在依赖销毁时未被正确销毁

时间:2012-04-24 01:47:18

标签: youtube youtube-api ruby-on-rails-3.2 nested-resources dependent-destroy

我在使用时遇到了一个问题:youtube视频在布道及其布道视频之间的嵌套belongs_to has_one关系中被正确销毁:dependent => :破坏。

我正在使用youtube_it gem并拥有相当普通的设置。

以下相关位:

视频控制器 -

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上的视频不是。

我试图用模型中的方法覆盖destroy动作,但可能由于我的理解失败,只能从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 个答案:

答案 0 :(得分:0)

看起来我刚刚解决了这个问题;但是,如果有人有一个更优雅/更合适的解决方案,我会保持开放状态。

在讲道视频模型中,我添加了 -

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