我正在尝试为帖子添加基本评论功能。我可以显示评论表单,但一旦保存,它们就不会显示在帖子下面。到目前为止我所拥有的:
class CommentsController < ApplicationController
def create
@topic = Topic.find(params[:topic_id])
@post = Post.find(params[:post_id])
@comment = current_user.comments.build(comment_params)
redirect_to [@topic, @post]
end
private
def comment_params
params.require(:comment).permit(:body)
end
end
class PostsController < ApplicationController
def show
@topic = Topic.find(params[:topic_id])
@post = Post.find(params[:id])
@comments = @post.comments
end
<h1><%= markdown_to_html @post.title %></h1>
<div class="row">
<div class="col-md-8">
<small>
<%= image_tag(@post.user.avatar.tiny.url) if @post.user.avatar? %>
submitted <%= time_ago_in_words(@post.created_at) %> ago by
<%= @post.user.name %>
</small>
<p><%= markdown_to_html( @post.body) %></p>
<h2>Comments</h2>
<% @comments.each do |comment| %>
<%= render partial: 'comments/comment', locals: {comment: comment} %>
<% end %>
<%= render partial: 'comments/form', locals: {topic: @topic, post: @post} %>
</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>
<p><%= p comment.body %></p>
<%= form_for [topic, post, post.comments.new] do |f| %>
<% if post.comments.new.errors.any? %>
<div class="alert alert-danger">
<h4>There are <%= pluralize(post.errors.count, "error") %>.</h4>
<ul>
<%= post.comments.new.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<%= form_group_tag(post.comments.new.errors[:body]) do %>
<%= f.label :body %>
<%= f.text_area :body, rows: 1, class: 'form-control', placeholder: "Enter comment body" %>
<% end %>
<div class="form-group">
<%= f.submit "Save", class: 'btn btn-success' %>
</div>
<% end %>
我认为应该是所有相关的代码。功能似乎存在,但我必须对提交过程做错。有人能指出我正确的方向吗?
谢谢,
马特
我将validates :body, length: {minimum: 5}, presence: true
添加到帖子模型,将@comment = current_user.comments.create!(comment_params)
添加到评论控制器。
如果我提交一个包含&lt; 5个字符的评论表单,我会收到'验证失败:正文太短(最少5个字符)'的消息,但如果消息符合要求则会提交,不会发生任何事情。
答案 0 :(得分:1)
您忘记保存评论。而不是:
@comment = current_user.comments.build(comment_params)
你应该使用
@comment = current_user.comments.create(comment_params)
collection.build(attributes = {},...)
返回一个或多个集合类型的新对象,这些对象已使用属性进行实例化,并通过外键链接到此对象,但尚未保存。
Here是更多详情。
答案 1 :(得分:1)
请注意,您已将评论与User
与以下行
current_user.comments.create(...)
但是,您无法将新创建的评论与Post
相关联。当您随后致电@post.comments
时,您将无法返回Comment
,因为它从未附加到Post
由于您可以访问@post
中的CommentsController
,因此我建议您在create
操作中执行以下操作
def create
# ...
current_user.comments.create(comment_params_with_post)
# ...
end
def comment_params_with_post
comment_params.merge(post: @post)
end