用户可以在屏幕上发表评论,并由 PublicActivity 进行跟踪:
@comment.create_activity :create, owner: current_user, recipient: @comment.screen.user
注释取决于: :destroy 屏幕型号。
但是,当我删除屏幕时,虽然评论被删除,但该评论的 PublicActivity 记录仍然存在。
这是我的Screens Controller
:
def destroy
@activity = PublicActivity::Activity.find_by_trackable_id(params[:id])
@activity.destroy #<-- Heres the Problem
@screen.destroy
respond_to do |format|
format.html { redirect_to root_path }
format.json { head :no_content }
end
end
但删除屏幕后,我得到undefined method
destroy' for nil:NilClass`。
我在 Railscast 上读到:
这是由于在对象创建后调用了create_activity方法
被摧毁了。
根据 gem 维护者的说法,你只需假设记录即可
会被销毁,并在销毁前调用create_activity
我缺少什么?
以下信息
屏幕.rb
belongs_to :user
has_many :comments, :dependent => :destroy
评论.rb
belongs_to :user
belongs_to :screen
屏幕控制器.rb
def create
@screen = current_user.screens.build(screen_params)
respond_to do |format|
if @screen.save
format.html { redirect_to @screen, notice: 'You successfully uploaded your Screenshot.' }
format.json { render action: 'show', status: :created, location: @screen }
current_user.add_points(2, 'Points for Uploading a Screenshot')
else
format.html { render action: 'new' }
format.json { render json: @screen.errors, status: :unprocessable_entity }
end
end
end
def destroy
@activity = PublicActivity::Activity.find_by_trackable_id(params[:id])
@activity.destroy
@screen.destroy
respond_to do |format|
format.html { redirect_to root_path }
format.json { head :no_content }
current_user.substract_points(1, "Substraction for Deleting a Screenshot")
end
end
评论控制器.rb
def create
@screen = Screen.find(params[:screen_id])
@comment = current_user.comments.build(comment_params)
@comment.screen_id = @screen.id
respond_to do |format|
if @comment.save
# Create Record for Public Activity
@comment.create_activity :create, owner: current_user, recipient: @comment.screen.user
format.html { redirect_to @screen, notice: 'Comment was successfully created.' }
format.json { render action: 'show', status: :created, location: @comment }
else
format.html { render action: 'new' }
format.json { render json: @comment.errors, status: :unprocessable_entity }
end
end
end
def destroy
@comment.destroy
respond_to do |format|
@activity = PublicActivity::Activity.find_by_trackable_id(params[:id])
@activity.destroy
format.html { redirect_to :back }
format.json { head :no_content }
end
end
这就是我的屏幕控制器销毁操作现在的样子:
def destroy
@screen = current_user.screens.find(params[:id])
@activity = PublicActivity::Activity.find_by_trackable_id(params[:id])
@activity.destroy
@screen.destroy
current_user.substract_points(1, "Substraction for Deleting a Screenshot")
respond_to do |format|
format.html { redirect_to root_path }
end
end
又出现同样的错误: