向帖子提交和显示评论

时间:2015-03-10 11:07:38

标签: ruby-on-rails

我正在尝试为帖子添加基本评论功能。我可以显示评论表单,但一旦保存,它们就不会显示在帖子下面。到目前为止我所拥有的:

评论控制器

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个字符)'的消息,但如果消息符合要求则会提交,不会发生任何事情。

2 个答案:

答案 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