如何从控制器操作中调用另一个控制器操作?

问题描述:

所以我有一个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: :destroyhas_one :node, as: :media, :dependent => :destroy视频。 RB。那么当你在node.rb中使用这一行时,你不应该得到无限递归: belongs_to :media, polymorphic: true, dependent: :destroy

+0

Hrmm ...有趣。我仍然想知道如何删除相关的对象。思考? – marcamillion 2014-10-10 00:37:32

+0

这真的不行吗? – davidkovsky 2014-10-10 00:55:39

+0

其实......我的坏......你是对的。这确实奏效。谢谢! – marcamillion 2014-10-10 01:09:11