2014-10-09 7 views
0

Итак, у меня есть node, который может быть разных типов (a Comment & Video).Как я могу вызвать другое действие контроллера из действия контроллера?

Что бы я хотел, это когда я удаляю node, он также должен удалить базовый объект, на который указывает - например. a 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 

ответ

1

Я думаю, что вы хотите взять dependent: :destroy из has_one :node, as: :media, :dependent => :destroy в видео. гь. Тогда вы не должны получать бесконечную рекурсию, когда используете эту строку в node.rb: belongs_to :media, polymorphic: true, dependent: :destroy

+0

Hrmm ... interesting. Я все еще хочу выяснить, как удалить связанные объекты. Мысли? – marcamillion

+0

Разве это действительно не сработало? – davidkovsky

+0

На самом деле ... мой плохой .... ты прав. Это сработало. Благодаря! – marcamillion

Смежные вопросы