Clyde Brown
Clyde Brown

Reputation: 217

Comments to my reddit clone ruby pulls a NameError

I'm trying to add comment functionality of my Reddit clone. This is the comments controller that creates a comments and adds it to a post.

class CommentsController < ApplicationController
    def new
        @topic = Topic.find(params[:topic_id])
        @post = Post.find(params[:id])
        @comment = Comment.new
        #authorize @comment       # from include Pundit in the application controller, authorize is an inherited method
   end

    def create
         @topic = Topic.find(params[:topic_id])
        @post = Post.find(params[:id])
        @comment = current_user.comments.build(comment_params)
    end

 private

    def comment_params
       params.require(:comment).permit(:text)
    end
 end

I'm trying to add a comments field for every post page by using a form partial that looks like this:

<%= form_for [topic, post] do |f| %>

<%= form_group_tag(comment[:text]) do %>
    <%= f.label :text %>
    <%= f.text_area :text, rows: 10, class: 'form-control', placeholder: "Enter your comment" %>
    <% end %>

<div class = "form-group">
    <%= f.submit "Save", class: 'btn btn-success' %>
</div>

<% end %>

This form partial should appear at the post.show.html.erb so I put it there

  <h1><%= markdown @post.title %></h1>

<div class="row"> <!-- what others are there besides row? -->
    <div class="col-md-8">
        <p><%= markdown @post.body %></p>
    </div>
   <div class="col-md-4">
    <% if policy(@post).edit? %>
        <%= link_to "Edit", edit_topic_post_path(@topic, @post), class: 'btn btn-success' %>
    <% end %>
   </div>
   <div class="col-md-8">
        <%= render partial: 'comments/form', locals: { topic: @topic, post: @post, text: @post.comments.new } %>
    </div>
</div>

but I'm getting a NameError for my 'comment' on the form_group_tag line. Most of what I defined here comes from my code for adding new posts, which seemed to work. Is there something missing here?


I fixed my name error by adding comments to the form_for line, but I'm getting NoMethodError for my topic,post,comment path, so I thought it'd be helpful to add what rake routes is pulling up.

    new_user_session GET    /users/sign_in(.:format)                   devise/sessions#new
        user_session POST   /users/sign_in(.:format)                   devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format)                  devise/sessions#destroy
       user_password POST   /users/password(.:format)                  devise/passwords#create
   new_user_password GET    /users/password/new(.:format)              devise/passwords#new
  edit_user_password GET    /users/password/edit(.:format)             devise/passwords#edit
                     PATCH  /users/password(.:format)                  devise/passwords#update
                     PUT    /users/password(.:format)                  devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)                    devise/registrations#cancel
       user_registration POST   /users(.:format)                           devise/registrations#create
   new_user_registration GET    /users/sign_up(.:format)                   devise/registrations#new
  edit_user_registration GET    /users/edit(.:format)                      devise/registrations#edit
                     PATCH  /users(.:format)                           devise/registrations#update
                     PUT    /users(.:format)                           devise/registrations#update
                     DELETE /users(.:format)                           devise/registrations#destroy
   user_confirmation POST   /users/confirmation(.:format)              devise/confirmations#create
   new_user_confirmation GET    /users/confirmation/new(.:format)          devise/confirmations#new
                     GET    /users/confirmation(.:format)              devise/confirmations#show
                user PATCH  /users/:id(.:format)                       users#update
                     PUT    /users/:id(.:format)                       users#update
         topic_posts POST   /topics/:topic_id/posts(.:format)          posts#create
      new_topic_post GET    /topics/:topic_id/posts/new(.:format)      posts#new
     edit_topic_post GET    /topics/:topic_id/posts/:id/edit(.:format) posts#edit
          topic_post GET    /topics/:topic_id/posts/:id(.:format)      posts#show
                     PATCH  /topics/:topic_id/posts/:id(.:format)      posts#update
                     PUT    /topics/:topic_id/posts/:id(.:format)      posts#update
                     DELETE /topics/:topic_id/posts/:id(.:format)      posts#destroy
              topics GET    /topics(.:format)                          topics#index
                     POST   /topics(.:format)                          topics#create
           new_topic GET    /topics/new(.:format)                      topics#new
          edit_topic GET    /topics/:id/edit(.:format)                 topics#edit
               topic GET    /topics/:id(.:format)                      topics#show
                     PATCH  /topics/:id(.:format)                      topics#update
                     PUT    /topics/:id(.:format)                      topics#update
                     DELETE /topics/:id(.:format)                      topics#destroy
       post_comments POST   /posts/:post_id/comments(.:format)         comments#create
               posts GET    /posts(.:format)                           posts#index
                     POST   /posts(.:format)                           posts#create
            new_post GET    /posts/new(.:format)                       posts#new
           edit_post GET    /posts/:id/edit(.:format)                  posts#edit
                post GET    /posts/:id(.:format)                       posts#show
                     PATCH  /posts/:id(.:format)                       posts#update
                     PUT    /posts/:id(.:format)                       posts#update
                     DELETE /posts/:id(.:format)                       posts#destroy
               about GET    /about(.:format)                           welcome#about
                root GET    /                                          welcome#index

BTW: how does this routes.rb file look?

 Rails.application.routes.draw do
     devise_for :users
  resources :users, only: [:update]
     resources :topics do
        resources :posts, except: [:index]
     end
  resources :posts do
     resources :comments, only: [:create]
  end
end

Upvotes: 0

Views: 74

Answers (2)

Sergey Sokolov
Sergey Sokolov

Reputation: 994

Try:

<%= render partial: 'comments/form', locals: { topic: @topic, post: @post, comment: @post.comments.new } %>
...

<%= form_for [post, comment] do |f| %>
  <%= f.label :text %>
  <%= f.text_area :text, rows: 10, class: 'form-control', placeholder: "Enter your comment" %>

  <%= f.submit "Save", class: 'btn btn-success' %>

<% end %>
...

If it does not help, try to temporary comment form_group_tag and send error here

Upvotes: 1

Jiř&#237; Posp&#237;šil
Jiř&#237; Posp&#237;šil

Reputation: 14412

It seems like you're sending the comment down to the partial as text.

... locals: { topic: @topic, post: @post, text: @post.comments.new } %>
                                          ^^^^

And by the way you're not saving the comment in the create action.

Upvotes: 1

Related Questions