嵌套资源未在从属销毁时正确销毁



在使用 :d ependent => :d estroy 时,我在讲道与其讲道视频之间的嵌套belongs_to has_one关系中正确销毁 youtube 视频时遇到问题。

我正在使用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 %>

感谢您的帮助,非常感谢!

看起来我刚刚解决了这个问题; 但是,我会让它开放一段时间,以防有人有更优雅/合适的解决方案。

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

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

相关内容

  • 没有找到相关文章