如何从控制器操作中调用另一个控制器操作?
问题描述:
所以我有一个node
它可以是不同的类型(一个Comment
& Video
)。如何从控制器操作中调用另一个控制器操作?
我想要发生的是每当我删除node
时,它也应该删除它指向的基础对象 - 例如,一个Video
。
这里是我的模型(需要截断为简洁起见):
Node.rb
# == Schema Information
#
# Table name: nodes
#
# id :integer not null, primary key
# name :string(255)
# family_tree_id :integer
# user_id :integer
# media_id :integer
# media_type :string(255)
# created_at :datetime
# updated_at :datetime
# circa :datetime
# is_comment :boolean
#
class Node < ActiveRecord::Base
belongs_to :family_tree
belongs_to :user
belongs_to :media, polymorphic: true
has_many :comments, dependent: :destroy
has_many :node_comments, dependent: :destroy
def is_video?
self.media_type == 'Video'
end
def comment_count
self.node_comments.count + self.comments.count
end
end
这是我Video.rb
:
# == Schema Information
#
# Table name: videos
#
# id :integer not null, primary key
# title :string(255)
# description :string(255)
# yt_video_id :string(255)
# is_complete :boolean
# created_at :datetime
# updated_at :datetime
# reply_id :integer
# circa :datetime
#
class Video < ActiveRecord::Base
# attr_accessible :title, :description, :yt_video_id, :is_complete, :user_ids
has_many :participants, dependent: :destroy
has_many :users, through: :participants
has_one :node, as: :media, :dependent => :destroy
accepts_nested_attributes_for :node, update_only: true
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
end
Comment.rb
# == Schema Information
#
# Table name: comments
#
# id :integer not null, primary key
# user_id :integer
# message :text
# node_id :integer
# created_at :datetime
# updated_at :datetime
#
class Comment < ActiveRecord::Base
validates :message, presence: true
belongs_to :user
belongs_to :node
def self.search(query)
where("title like ? OR description like ?", "%#{query}%", "%#{query}%")
end
end
NodeController#Destroy
def destroy
@node.destroy
respond_to do |format|
format.html { redirect_to root_path }
format.json { head :no_content }
end
end
VideoController#Destroy
def destroy
authorize! :read, @family_tree
@video = Video.find(params[:id])
if Video.delete_video(@video)
flash[:notice] = "video successfully deleted"
else
flash[:error] = "video unsuccessfully deleted"
end
redirect_to dashboard_index_path
end
CommentController#Destroy
def destroy
@comment.destroy
respond_to do |format|
format.html { redirect_to comments_url }
format.json { head :no_content }
end
end
因此,所有我想要做的是,每当有一个节点中删除,我希望它删除相关视频&评论。
我尝试添加这对我Node.rb
模型,但是当我点击删除它返回一个“堆栈级别太深错误”:
belongs_to :media, polymorphic: true, dependent: :destroy
答
我想你想利用dependent: :destroy
出 has_one :node, as: :media, :dependent => :destroy
视频。 RB。那么当你在node.rb中使用这一行时,你不应该得到无限递归: belongs_to :media, polymorphic: true, dependent: :destroy
Hrmm ...有趣。我仍然想知道如何删除相关的对象。思考? – marcamillion 2014-10-10 00:37:32
这真的不行吗? – davidkovsky 2014-10-10 00:55:39
其实......我的坏......你是对的。这确实奏效。谢谢! – marcamillion 2014-10-10 01:09:11