问题描述
用户可以在屏幕上发表评论,并通过PublicActivity进行跟踪:
User's can comment on a Screen and it's tracked by PublicActivity :
@comment.create_activity :create, owner: current_user, recipient: @comment.screen.user
并且注释是依赖的::destroy在屏幕模型上.
and the comments are dependent: :destroy on the screen model.
但是当我删除屏幕时,尽管删除了注释,但是PublicActivity中该注释的记录仍然存在.
But when i delete a screen, while the comments are deleted, the Record from PublicActivity for that comment still exists.
这是我的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
但是在删除屏幕后,我得到nil:NilClass`的undefined method
destroy'.
But upon deleting a Screen, i'm getting undefined method
destroy' for nil:NilClass`.
我在Railscast上阅读:
I read on Railscast:
根据gem维护者,您只需要假设记录即可 将被销毁,并在销毁之前调用create_activity
According to the gem maintainers, you simply have to assume the record will be destroyed, and call create_activity before the destroy
我想念什么?
screen.rb
screen.rb
belongs_to :user
has_many :comments, :dependent => :destroy
comment.rb
comment.rb
belongs_to :user
belongs_to :screen
screens_contoller.rb
screens_contoller.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
comments_controller.rb
comments_controller.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
再次遇到相同的错误:
推荐答案
这未经测试,但这是我认为您应该做的.
This isn't tested, but this is what I think you should do.
首先,您可以在screens_controller#destroy中删除对活动的引用
First you can remove the references to activities in your screens_controller#destroy
然后在您的comments_controller#destroy中
Then in your comments_controller#destroy
@comment = current_user.comments.find(params[:id])
@activity = PublicActivity::Activity.find_by(trackable_id: (params[:id]), trackable_type: controller_path.classify)
@activity.destroy
@comment.destroy
应该在您对屏蔽的回应之外
Should be outside of your respond to block
接下来,在您的评论模型中,您应该执行以下操作:
Next in your comments model you should do something like this:
#comment.rb
private
before_destroy :find_and_destroy_comments
def find_and_destroy_comments
activity = PublicActivity::Activity.find_by(trackable_id: self.id, trackable_type: self.class.name)
if activity.present?
activity.destroy
end
end
调用before_destroy方法将覆盖在dependent: :destroy
calling the before_destroy method overrides the default ruby destroy method that is called during dependent: :destroy
让我知道这是否可行,但应该可以.
Let me know if this works, but It should.
这篇关于在公共活动中未定义的方法"destroy"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!