Undefined method `destroy 'on Public Activity

The user can comment on the screen and track it at the address of PublicActivity:

@comment.create_activity :create, owner: current_user, recipient: @comment.screen.user 

and comments depend on :: destroy on the screen.

But when I delete the screen and the comments are deleted, the entry from PublicActivity for this comment still exists.

here is my 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 

But when I delete the screen, I get an undefined method destroy 'for nil: NilClass`.

I read in Railscast:

this is called by calling the create_activity method after the object has been destroyed.

According to the custodians of the gemstones, you just need to take the record will be destroyed and will cause create_activity before destruction

What am I missing?

Info below

screen.rb

 belongs_to :user has_many :comments, :dependent => :destroy 

comment.rb

 belongs_to :user belongs_to :screen 

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

  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 

What my Destroy Action screen controller looks like right now:

  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 

Again the same error:

enter image description here

+1
source share
1 answer

This is not verified, but it is what I think you should do.

First you can remove the action links in your screen_controller # destroy

Then in your comment_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 

Must be outside your block response

Next in your comment 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 

calling the before_destroy method overrides the default ruby ​​destruction method, which is called during dependent: :destroy

Let me know if this works, but it should.

+5
source

Source: https://habr.com/ru/post/1485791/


All Articles