Question

Problem: Looking for the right comment that belongs to a post

I am trying to implement a "like" function (just like on facebook) for comments on a specific post. I've already implemented the same function for my posts, but "pointing at the right comment" is giving me hard time. To clarify, my "like" function results in the following GET call:

http://localhost:3000/posts/11/comments/4/like

But it's actually supposed to call

/posts/4/comments/11/like

I checked my route, and it seems right to me

like_post_comment GET    /posts/:post_id/comments/:id/like(.:format)

So I guess the problem lies in the controller.

In the beginning of my like action in comments_controller, I have

def like
    @post = Post.find(params[:post_id])
    @comment = @post.comments.find(params[:comment])

I think this must be wrong, but I'm not sure why or how to fix it. The other actions set local variables @post and @comment in a similar way, but they do the job correctly.

def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.create(params[:comment])

def destroy
    @post = Post.find(params[:post_id])
    @comment = @post.comments.find(params[:comment])

How I render my link to comment

<td><b><%= link_to 'like', like_post_comment_path(comment) %></b></td>
Was it helpful?

Solution

Replace your link from

<td><b><%= link_to 'like', like_post_comment_path(comment) %></b></td>

to

<td><b><%= link_to 'like', like_post_comment_path(@post, comment) %></b></td>

And replace your like action in controller with

def like
  @post = Post.find(params[:post_id])
  @comment = @post.comments.find(params[:id])
  # ...
end

OTHER TIPS

call it like this

<%= link_to 'like', like_post_comment_path(@post, comment) %>

where @post is the current post object

this:

/posts/:post_id/comments/:id/like(.:format)

tells me that your post is identified by the post_id param, and your comment is identified by the id param. therefore, your like method should look like this:

def like
  @post = Post.find(params[:post_id])
  @comment = @post.comments.find(params[:id])
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top