Hi,
trying to sort out this error for a while now, no luck.
I get this error above when adding a new comment for a blogpost. The blog is clearly there. Any insight would be much appreciated.
_comment.html.erb
<div class="comment-card">
<div class="card">
<div class="card-block">
<div class="row">
<div class="col-md-1">
</div>
<div class="col-md-11">
<%= comment.content %>
</div>
</div>
</div>
</div>
</div>
_comment_form.html.erb
<% unless current_user.is_a? GuestUser %>
<%= form_for @comment, url: '#' do |f| %>
<div class="form-group">
<%= f.label :content %>
<%= f.text_area :content, class: 'form-control' %>
</div>
<%= f.submit 'Post Comment', class: 'btn btn-primary' %>
<% end %>
<% end %>
comment.rb
class Comment < ApplicationRecord
belongs_to :user
belongs_to :blog
validates :content, presence: true, length: { minimum: 5, maximimum: 1000 }
after_create_commit { CommentBroadcastJob.perform_later(self) }
end
comment_controller.rb
class CommentsController < ApplicationController
def create
@comment = current_user.comments.build(comment_params)
end
private
def comment_params
params.require(:comment).permit(:content)
end
end
blogs_controller.rb
def show
@blog = Blog.includes(:comments).friendly.find(params[:id])
@comment = Comment.new
@page_title = @blog.title
@seo_keywords = @blog.body
end
blogs_channel.rb
class BlogsChannel < ApplicationCable::Channel
def subscribed
stream_from "blogs_#{params['blog_id']}_channel"
end
def unsubscribed
end
def send_comment(data)
current_user.comments.create!(content: data['comment'], blog_id: data['blog_id'])
end
end
blogs_controller.rb
def show
@blog = Blog.includes(:comments).friendly.find(params[:id])
@comment = Comment.new
end
show.html.erb
<div class="col-sm-8 blog-main">
<h2> <%= @blog.title %></h2>
<%= link_to 'Edit', edit_blog_path(@blog) if logged_in?(:site_admin) %>
<p><%= @blog.body %></p>
<%= render 'comments/comment_form' %>
<div id="comments" data-blog-id="<%= @blog_id %>">
<%= render @blog.comments %>
</div>
</div>
I can create the comment in terminal:
[2] pry(main)> Comment.create!(user_id: User.last.id, blog_id: Blog.last.id, content: "1234567")
User Load (0.4ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT $1 [["LIMIT", 1]]
Blog Load (0.2ms) SELECT "blogs".* FROM "blogs" ORDER BY "blogs"."id" DESC LIMIT $1 [["LIMIT", 1]]
(0.1ms) BEGIN
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]]
Blog Load (0.1ms) SELECT "blogs".* FROM "blogs" WHERE "blogs"."id" = $1 LIMIT $2 [["id", 20], ["LIMIT", 1]]
SQL (54.8ms) INSERT INTO "comments" ("content", "user_id", "blog_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id" [["content", "1234567"], ["user_id", 1], ["blog_id", 20], ["created_at", "2018-02-02 05:45:37.058157"], ["updated_at", "2018-02-02 05:45:37.058157"]]
(9.1ms) COMMIT
Enqueued CommentBroadcastJob (Job ID: 22604b93-a864-4213-a348-0e0da6c69ee0) to Async(default) with arguments: #<GlobalID:0x007f93f1e3cfb0 @uri=#<URI::GID gid://web-portfolio/Comment/7>>
=> #<Comment:0x007f93f52996f0
id: 7,
content: "1234567",
user_id: 1,
blog_id: 20,
created_at: Fri, 02 Feb 2018 05:45:37 UTC +00:00,
updated_at: Fri, 02 Feb 2018 05:45:37 UTC +00:00>
[3] pry(main)> Comment Load (0.4ms) SELECT "comments".* FROM "comments" WHERE "comments"."id" = $1 LIMIT $2 [["id", 7], ["LIMIT", 1]]
Performing CommentBroadcastJob (Job ID: 22604b93-a864-4213-a348-0e0da6c69ee0) from Async(default) with arguments: #<GlobalID:0x007f93f0fd68b8 @uri=#<URI::GID gid://web-portfolio/Comment/7>>
Blog Load (0.3ms) SELECT "blogs".* FROM "blogs" WHERE "blogs"."id" = $1 LIMIT $2 [["id", 20], ["LIMIT", 1]]
Rendered comments/_comment.html.erb (1.7ms)
[ActionCable] Broadcasting to blogs_20_channel: {:comment=>"\t<div class=\"comment-card\">\n\t\t<div class=\"card\">\n\t\t\t<div class=\"card-block\">\n\t\t\t\t<div class=\"row\">\n\t\t\t\t\t<div class=\"col-md-1\">\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"col-md-11\">\n\t\t\t\t\t\t1234567\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>"}
Performed CommentBroadcastJob (Job ID: 22604b93-a864-4213-a348-0e0da6c69ee0) from Async(default) in 424.54ms
Terminal output when adding comment in browser:
Could not execute command from ({"command"=>"message", "identifier"=>"{\"channel\":\"BlogsChannel\",\"blog_id\":\"\"}", "data"=>"{\"comment\":\"sdgergre\",\"blog_id\":\"\",\"action\":\"send_comment\"}"}) [ActiveRecord::RecordInvalid - Validation failed: Blog must exist]: