0
votes

I'm working on a ROR blog and have encountered some issues along the way. I'm currently learning Rails and just feel completely lost with connecting all the pieces. I've been working on my comments section for days and was finally able to create comments on posts, but I can't edit or delete them. I also referenced the SO questions below but am still running into problems.

Here's my layout:

Comment model params:

body \ user_id \ post_id

Model associations:

user.rb

has_many :posts
has_many :comments

post.rb

belongs_to :user
has_many :comments

comment.rb

belongs_to :user
belongs_to :post

routes.rb:

Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html

  get '/' => 'users#index'

  get '/posts' => 'posts#index'

  post '/posts/create' => 'posts#new'

  post '/posts/edit' => 'posts#edit'

  get '/signin' => 'sessions#new', as: :new_session
  post '/create-session' => 'sessions#create', as: :create_session
  get 'signout' => 'sessions#destroy', as: :destroy_session

  resources :users

  resources :posts
  resources :comments
end

comments controller:

class CommentsController < ApplicationController

  def index
    @comment = Comment.all 
  end

  def new
    user = session[:user_id]
    @comment = Comment.new(post_id: params[:post_id])
    @post = Post.find(params[:post_id])
  end

  def create
    @comment = Comment.new(comment_params)
    @comment.user_id = session[:user_id]
    @postid = params[:id]
    if @comment.save
      flash[:notice] = "comment created."
      redirect_to '/posts'
    else
      flash[:error] = "Error creating comment."
      redirect_to '/posts'
    end
  end

  def edit
    @post = Post.find(params[:id])
  end

  def update
    @comment = Comment.find_by_id(params[:id])
    @comment.update(comment_params)
    flash[:notice] = "Comment updated."
    redirect_to '/posts'
  end

  def destroy
    @comment = Comment.find(params[:comment_id])
    @comment.destroy
    redirect_to '/posts'
  end

  private 

    def comment_params
      params.require(:comment).permit(:body, :user_id, :post_id)
    end
  end

Posts show.html.erb page in views/posts folder:

<%# show all posts %>

<div id="single-post">
    <h1>User - <%= @post.user.username %></h1>

        <h2>Post -  <%= @post.body %> </h2>

        <%= link_to("Edit Post", edit_post_path(@post)) %>
        </br>
        <%= link_to("Delete Post", @post, method: 'delete') %>
        </br>
        <%= link_to("Add Comment", new_comment_path(post_id: @post.id)) %>
        <%#<%= link_to("Edit Comment", edit_comment_path(post_id: @post.id, comment_id: @comment.id))%>
</div>


    <h3><% @post.comments.reverse.each do |c| %> </h3> 
        <div id="single-comment">
            <h4>Comment</h4>
            <h5>From - <%= c.user.username %></h5>

            <h6><%= c.body %> </h6>

            </br>
            <%= link_to("Edit Comment", edit_comment_path(@post.id)) %>
            </br>
            <%= link_to("Delete Comment", comment_path(@post.id), method: :delete) %>

        </div>
    <% end %>

</div>

new.html.erb form in views/comments folder

<div id="comment-form">
    <%= form_for @comment do |f| %>
        <%= f.label :body %>
        <%= f.text_area :body, class: "text-area" %>
        <%= f.hidden_field :post_id %>
        <%= f.submit %>
    <% end %>
</div>

Again I can add comments to posts. When I hover over the edit tag on the comment I'm seeing this: localhost:3000/comments/72/edit

I see this error when I click on edit

error when trying to edit a comment

When I hover over the delete button I see this: localhost:3000/comments/72

I see this error when I click on delete

error when trying to delete a comment

I'm at the point where I'm completely lost and feel I have tried everything possible but nothing seems to work. Please help! Here's the GitHub repo as well: https://github.com/angelr1076/rails-blog

1
I took a quick look at your repo, but this didn't seem to include the links for editing comments. Can you check that your latest changes have been pushed.mikej
Hi Mike. I just pushed my most recent changes to github. Thanks for taking a look at this! github.com/angelr1076/rails-blogJackJack

1 Answers

0
votes

The First argument in form cannot contain nil or be empty is telling you that @comment in <%= form_for @comment do |f| %> is nil. This is because in the edit action of your CommentsController you are setting @post instead of @comment.

Change this to be:

def edit
  @comment = Comment.find(params[:id])
end

For deleting a comment, the Couldn't find Comment without an ID is telling you that the value you're passing to find is nil. This is because you're trying to use params[:comment_id] instead of params[:id]. Change the destroy action to:

def destroy
  @comment = Comment.find(params[:id])
  @comment.destroy
  redirect_to '/posts'
end

Update:

Also as per your code, you should change edit and delete links to below

<%= link_to("Edit Comment", edit_comment_path(c)) %>
<%= link_to("Delete Comment", comment_path(c), method: :delete)

You are passing @post.id which is an id of post. Instead you should pass id of the comment using the block variable from your comments.each, noticing that the .id isn't needed here because it can be inferred by Rails.