如何确保主页中显示的 Post 提要中的每个 post 的所有评论都显示在其下方?

How do I make sure each post in the Post feed shown in the home page has all its comments displayed under it?

我有一个 Post 模型,和一个属于 Post 的 Comment 模型。我能够在与家庭控制器和家庭操作以及 User/show 视图相对应的家庭视图中显示 Post。因此,在主页和用户视图中,post 是按创建时间顺序列出的。我还能够在用户和主页视图中都有一个 post 表单,在主页和用户视图中都有一个评论表单。

当我尝试在主视图和用户视图中的每个 Post 下方显示评论时出现问题。如何在主页和用户视图中的 post 下列出与每个 post 关联的评论?

如何确保数据库中的评论列在相应的 post 下?

这是我的评论控制器:

class CommentsController < ApplicationController
 def index
 @comments =Comment.all.paginate(page: params[:page])
  end
 def show
 @comment = Comment.find(params[:id])
 @post = @Comment.post
 end
 def new
 end
 def create
 @comment = Comment.new(comment_params)
  if @comment.save
  flash[:success] = "Comment created"
  redirect_to :back
  else
  render 'new'
  end
  end
  def edit
  @comment = Comment.find(params[:id])
  end
  def update
  @comment = comment.find(params[:id])
  if @comment.update_attributes(comment_params)
  flash[:success] = "Comment updated"
  redirect_to @comment.post
  else
  render 'edit'
  end
  end
  def destroy
    Comment.find(params[:id]).destroy
    flash[:success] = "Comment deleted"
    redirect_to users_url
  end  
  private
  def comment_params
  params.require(:comment).permit(:author_name, :body)
  end
  end

这是我的主视图:app/views/home/home。html.erb:

<% if logged_in? %>
  <div class="row">
    <aside class="col-md-4">
    <section class="user_info">
      <%= render 'shared/user_info' %>
    </section>
    <hr/>
    <br/>
    <section class="stats">
      <%= render 'shared/stats' %>
    </section>
    <section class="post_form">
      <%= render 'shared/post_form' %>
      </section>
    </aside>
    <div class="col-md-8">
      <h3>Post Feed</h3>
      <%= render 'shared/feed' %>
    </div>
  </div>
<% else %>
  <div class="center jumbotron">
    <h1>Welcome to the Unstarv website</h1>
    <h2>
      Please sign up now to use this site
      <%= link_to "Sign Up",  signup_path =%> 
      now.
    </h2>
    <%= link_to "Sign up now!", signup_path, class: "btn btn-lg btn-primary" %>
  </div>
  <%= link_to image_tag("rails.png", alt: "unstarv logo"), '#' %>
<% end %>

这是我的家庭控制器:

class HomeController < ApplicationController
  def home
    if logged_in?
      @post  = current_user.posts.build
      @feed_items = current_user.feed.paginate(page: params[:page])  
    end
  end

  def about
  end

  def privacy
  end

  def terms
  end
end

这是我的 Post 模型,相关部分:

class Post < ActiveRecord::Base
  belongs_to :user
  has_many :comments
  default_scope -> { order(created_at: :desc) }
  mount_uploader :picture, PictureUploader
end

我的用户模型的相关部分:

class User < ActiveRecord::Base
  attr_accessor :remember_token
  before_save { self.email = email.downcase }
  has_many :posts, dependent: :destroy
  has_many :comments
  has_many :active_relationships, class_name:  "Relationship",
    foreign_key: "follower_id",
    dependent:   :destroy
  has_many :passive_relationships, class_name:  "Relationship",
    foreign_key: "followed_id",
    dependent:   :destroy
  has_many :following, through: :active_relationships, source: :followed  
  has_many :followers, through: :passive_relationships, source: :follower
  validates :username,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX },
    uniqueness: { case_sensitive: false }
  has_secure_password
  validates :password, length: { minimum: 6 }, allow_blank: true

  def feed
    following_ids = "SELECT followed_id FROM relationships WHERE  follower_id = :user_id"
    Post.where("user_id IN (#{following_ids}) OR user_id = :user_id", user_id: id)
  end
end

这是我的评论模型:

class Comment < ActiveRecord::Base
  belongs_to :post
  belongs_to :user
  default_scope -> { order(created_at: :desc) }  
end

这里是 post 控制器:

class PostsController < ApplicationController
  before_action :logged_in_user, only: [:create, :destroy]
  def index
    @posts = Post.all
  end
  def show
    @post = Post.find(params[:id])
    @comment = Comment.new
    @comment.post_id = @post.id
    @comments = @post.comments.all
  end
  def new
    @post = Post.new
  end
  def create
    @post = current_user.posts.build(post_params)
    if @post.save
      flash[:success] = "Post created!"
      redirect_to root_url
    else
      @feed_items = []
      render 'home/home'
    end
  end
  def edit
    @post = Post.find(params[:id])
  end
  def update
    @post = Post.find(params[:id])
    @post.update(post_params)
    flash.notice = "Post '#{@post.title}' Updated!"
    render 'home/home  '
  end

  def update
    @post = Post.find(params[:id])
    @post.update(post_params)
    flash.notice = "Post '#{@post.title}' Updated!"
    redirect_to root_url
  end

  private
  # Use callbacks to share common setup or constraints between actions.
  def set_post
    @post = Post.find(params[:id])
  end

  # Never trust parameters from the scary internet, only allow the white list through.
  def post_params
    params.require(:post).permit(:title, :body, :picture)
  end
end

这是我的 app/views/post/_post.html.erb 文件,

<li id="post-<%= post.id %>">
  <span class="user"><%= link_to post.user.username, post.user %></span>
  <span class="content">
    <%= post.title %>
    <%= post.body %>
    <%= image_tag post.picture.url if post.picture? %>
  </span>
  <span class="timestamp">
    Posted <%= time_ago_in_words(post.created_at) %> ago.
    <% if current_user?(post.user) %>
    <%= link_to "delete", post, method: :delete,
        data: { confirm: "You sure?" } %>
        <% end %>
  </span>
  <section>
    <h2>Your Comments here</h2>
    <h3>Post a Comment</h3>
    <h3>Post a Comment</h3>
    <%= render 'shared/comment_form' %>
    <% post.comments.all.each do |comment| %>
    <h4><small>Comment by</small> <%= comment.post.user.username %></h4> 
    <p class="comment"><%= comment.body %></p>
    <p><small>Posted <%= distance_of_time_in_words(Time.now,     comment.created_at) %> ago</small></p>
    <br/>
    <%end%>
</li>

这是我的 app/views/shared/comment_form_html.erb ,效果很好:

<%= form_for [ post, post.comments.build] do |f| %>
  <p>
    <%= f.label :body, "Your Comment" %><br/>
    <%= f.text_area :body %>
  </p>
  <p>
    <%= f.submit 'Submit' .  method="post", class: 'btn btn-primary' %>
  </p>
<% end %>

这是我的 app/views/posts/_post.html.erb

<li id="post-<%= post.id %>">
<span class="user"><%= link_to post.user.username, post.user %></span>
<span class="content">
<%= post.title %>
<%= post.body %>
<%= image_tag post.picture.url if post.picture? %>
</span>
<span class="timestamp">
Posted <%= time_ago_in_words(post.created_at) %> ago.
<% if current_user?(post.user) %>
 <%= link_to "delete", post, method: :delete,
                                   data: { confirm: "You sure?" } %>
<% end %>
</span>
<h2>Comments</h2>
<h3>Post a Comment</h3>
<%= render 'shared/comment_form', post: post %>       
<h3>Comments (<%= post.comments.size %>)</h3>
<% post.comments.each do |comment| %>
<h4><small>Comment by</small> <%= comment.post.user.username %></h4>
<p class="comment"><%= comment.body %></p>
<p>Posted <%= distance_of_time_in_words(Time.now, comment.created_at) %> ago</p>
</li>
<br/>
<%end%>

非常感谢您的帮助!!!!

问题与您创建评论的方式有关。

在实际代码中,注释不属于任何 post,因此在您的 comments_controller 中将 create 操作更改为:

def create
  post = Post.find(params[:post_id])
  @comment = post.comments.build(comment_params)
  if @comment.save
    flash[:success] = "Comment created"
    redirect_to :back
  else
    render 'new'
  end
end