8

我有一个模型发布has_many模型评论。

在一个Posts show动作上,有一个Comments找到的列表@comments = @post.comments

我还有一个用于创建新的Comments. 表单的对象是用@comment = @post.comments.build.

这一切都适用于列出和成功创建评论。

提交评论时出现错误时会出现此问题。错误以相同的形式显示(所以,在Post#show)通过render "posts/show"。在这种情况下,我必须@comments = @post.comments再次设置,但这次评论列表包括用户试图创建的尚未保存的评论。

我通过 using 解决了这个问题@post.comments.all,它只给了我保存的模型,但 Rails 抱怨这在 Rails 4 中已被弃用。

如何从我获得的评论列表中删除未保存的评论@post.comments

4

4 回答 4

2

我在 Rails 5 应用程序中遇到了类似的问题。这似乎是最直接的方法:

@comment = @post.comments.build
@comments = @post.comments.where.not(id: nil)
于 2018-08-08T16:47:09.463 回答
1

恕我直言,最有效的方法就是忽略视图中的新记录,而不是再次检索所有评论。

因此,在您看来,您将执行以下操作:

= f.simple_fields_for :comments do |c|
  - unless c.object.new_record? 
    = render 'comment_fields', :f => c
于 2013-09-17T07:42:59.440 回答
1

您可以向注释模型添加范围以仅查找数据库行而不是内存数据,例如:

class Comment < ActiveRecord::Base
  scope :by_post, ->(post) { where(post: post) }
end

调用者:@comments = Comment.by_post(@post)

于 2013-09-17T07:36:58.073 回答
0

您可以强制加载评论。你必须这样做: -

@comments = @post.comments(true)
于 2013-09-17T07:34:32.160 回答