Shaun
Shaun

Reputation: 103

Blank user_id in comments table when making associations with both users and posts

I'm using the sign-up and login that we built with the rails tutorial as a base for a Reddit clone that I’m making. As it stands the application is functioning properly apart from the user_id in comments table is blank when I make a comment, the link_id is present and correct so I can make comments on a link. The user_id in links table is also present and correct.

I'm fairly certain that the error i've made is in the create action of comments_controller.rb but it could also be my original migration. What's confusing me (as a novice) is I had this working in it's current form once before with rails 4.1.8 and device. However, using this approach with rails 4.2.1 using the rails tutorial as a base, it doesn't work. I'm a bit new here so I hope i've formulated the post correctly and given enough information so somebody could give me some pointers as to the problem

Comment Controller

    before_action :logged_in_user, only: [:create, :destroy]

def create
    @link = Link.find(params[:link_id])
    @comment = @link.comments.create(params[:comment].permit(:link_id, :body))
    @comment.user = User.find(current_user.id)
    redirect_to link_path(@link)
end

def destroy
    @link = Link.find(params[:link_id])
    @comment = @link.comments.find(params[:id])
    @comment.destroy
    redirect_to link_path(@link)
end

private

def logged_in_user
    unless logged_in?
        flash[:danger] = "Please log in."
        redirect_to login_url
    end
end

Form app/views/links/show.html.erb

<h2 class="comment-count"><%= pluralize(@link.comments.count, "comment") %></h2>
<%= render @link.comments %>
<%= form_for([@link, @link.comments.build]) do |f| %>
<%= render 'comments/fields', f: f %>
<%= f.submit "Save Comment", class: 'btn btn-primary margin-bottom-10' %>
<% end %>

Partials app/views/comments/_comment.html.erb

<p class="comment_body"><%= comment.body %></p>
<p class="comment_time"><%= time_ago_in_words(comment.created_at) %> Ago </p>

app/views/comments/_fields.html.erb

<%= render 'shared/comment_error_messages' %>
<%= f.label :body %>
<%= f.text_area :body, class: 'form-control' %>

Routes config/routes.rb

resources :links do
member do
  put "like", to: "links#upvote"
  put "dislike", to: "links#downvote"
end
resources :comments
end

Models app/models/link.rb

belongs_to :user
has_many :comments, dependent: :destroy

app/models/comment.rb

belongs_to :user
belongs_to :link
validates :body,  presence: true

app/models/user.rb

has_many :links, dependent: :destroy

Migration

class CreateComments < ActiveRecord::Migration
    def change
    create_table :comments do |t|
    t.integer :link_id
    t.text :body
    t.references :user, index: true, foreign_key: true

    t.timestamps null: false
   end
   add_index :comments, :link_id
   end
end

Hopefully that’s a good enough post and I’ve included everything you need so somebody can help me out, It's a rookie error but i can't see it. thanks in advance.

Regards

Upvotes: 1

Views: 80

Answers (1)

Pavan
Pavan

Reputation: 33542

As it stands, you are currently creating a comment without saving user_id for it. Try the below code

#comments_controller.rb
def create
  @link = Link.find(params[:link_id])
  @comment = @link.comments.new(params[:comment].permit(:link_id, :body))
  @comment.user = User.find(current_user.id)
  @comment.save
  redirect_to link_path(@link)
end

Upvotes: 1

Related Questions