在使用 :dependent => :destroy 时,我遇到了一个 youtube 视频在布道与其布道视频之间嵌套的 belongs_to has_one 关系中被正确销毁的问题。
我正在使用 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上的视频不是。
我试图用模型中的方法覆盖销毁操作,但可能由于我的理解失败,只能从 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 %>
感谢您的帮助,非常感谢!