我正在关注有关rails的教程,并且我面对一种奇怪的(我看待它的方式)的事情。
我有一个包含1个帖子和3条评论的数据库。注释和帖子在不同的表中分开,但注释具有指向posts表的外键属性。第一篇文章有2条与之相关的评论,rails控制台显示了这些评论。
p = Post.all
first = p[0]
comments = first.comments // Returns all the comments that have the post_id equal with the first post
当我在我看来试图看到这些问题时会出现问题。我导航到localhost:3000/posts/3/comments/
,我看到了所有评论,但我只想查看与该帖子相关的评论。 (在我的例子中,id为3的帖子)
这是我的routes.rb
Rails.application.routes.draw do
resources :comments
resources :posts do
resources :comments
end
end
注意
当我调用comments
方法返回正确的注释时,控制台表现正常(只有那些与帖子相关但是视图显示所有注释不仅仅是相关的
以下是模型:
class Post < ActiveRecord::Base
has_many :comments, dependent: :destroy
end
class Comment < ActiveRecord::Base
belongs_to :post
end
以下是comments/index.html.erb
:
<h1>Listing comments</h1>
<table>
<thead>
<tr>
<th>Post</th>
<th>Body</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% @comments.each do |comment| %>
<tr>
<td><%= comment.post_id %></td>
<td><%= comment.body %></td>
<td><%= link_to 'Show', comment %></td>
<td><%= link_to 'Edit', edit_comment_path(comment) %></td>
<td><%= link_to 'Destroy', comment, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
</table>
<br>
<%= link_to 'New Comment', new_comment_path %>
以下是comments_controller
:
class CommentsController < ApplicationController
before_action :set_comment, only: [:show, :edit, :update, :destroy]
# GET /comments
# GET /comments.json
def index
@comments = Comment.all
end
end
答案 0 :(得分:0)
我看到了所有评论,但我只想查看与该帖子相关的评论
在您的索引操作中,您将拥有类似
的内容@comments = Comment.all # this will have all the comments
在视图中呈现所有评论,因此您需要将其更改为:
def index
@post = Post.find(params[:post_id])
@comments = @post.comments #this will have comments associated with @post
end
<强>更新强>
您不能拥有两个相同的资源。您需要在路线中使用shallow nesting
,因此您的路线将如下所示:
resources :posts do
resources :comments, only: [:index, :new, :create]
end
resources :comments, only: [:show, :edit, :update, :destroy]