Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 奇怪的行为 背景_Ruby On Rails_Ruby On Rails 4_Renderpartial - Fatal编程技术网

Ruby on rails 奇怪的行为 背景

Ruby on rails 奇怪的行为 背景,ruby-on-rails,ruby-on-rails-4,renderpartial,Ruby On Rails,Ruby On Rails 4,Renderpartial,当我遇到由build 所以在指南里我写了一个博客,在那里帖子有评论部分。在指南中,他们将发布的评论显示在评论表单之前,用于添加新评论。不知何故,我想尝试另一种方法(首先是评论表单)。然而,当我这样做时,额外的空标记被呈现出来 起初,我认为它是从模型中呈现一个空注释,但在运行之后 <%= @article.comments.count %> # => 2 gives expected comments count 当使用建议的解决方案Comment.new时,所有方法都返回1,

当我遇到由
build

所以在指南里我写了一个博客,在那里帖子有评论部分。在指南中,他们将发布的评论显示在评论表单之前,用于添加新评论。不知何故,我想尝试另一种方法(首先是评论表单)。然而,当我这样做时,额外的空标记被呈现出来

起初,我认为它是从模型中呈现一个空注释,但在运行之后

<%= @article.comments.count %> # => 2 gives expected comments count
当使用建议的解决方案
Comment.new
时,所有方法都返回1,这与

编辑 更明确地陈述问题
增加了答案/讨论摘要

<%= form_for([@article, @article.comments.build]) do |f| %>
要避开这个问题,您需要创建一个
注释
,但不要将其与集合相关联。使用
Comment.new
而不是
@article.comments.build
应该足够了,因为记录本身并不重要


请注意,之所以看到正确数量的注释(
@article.comments.count
)是因为通过
build
创建的注释尚未保存到数据库,并且无论集合是否已加载,
#count
始终执行
count
查询。您可以使用
#size
来查看额外的注释(
@article.comments.size
)。

问题是,您的注释表单部分调用了
@article.comments.build
,这除了构造新的注释实例外,还将此实例添加到集合中。这就是为什么你会看到额外的评论。尝试改用
@article.comments.new

另见:

编辑


我刚刚发现自从Rails>3.2.13以来,
.new
方法已经改变。既然您已经用Rails-4为您的帖子添加了标签,那么我提出的解决方案就行不通了。取而代之的是,试着按照建议使用
@article.comments.scoped.new

额外的标签仍然会出现。@madsonic你可以试着只使用
Comment.new
这样吗?@madsonic
form_for([@article,Comment.new])
-注意注释的单数形式,它是模型的名称。还对答案进行了一点扩展,以解释显示的记录数“不正确”。这很有效!关于
count
vs
size
,我可以说
count
统计所有实例,不管它们是否被保存,而
size
只统计数据库中的实例吗?我相信
在rails 4中不推荐使用范围

<h4>
  <%= comment.commenter %>
</h4>
<p>
  <%= comment.body %>
</p>
<%= form_for([@article, @article.comments.build]) do |f| %>
  <p class="commenter">
    <%= f.label :commenter %><br>
    <%= f.text_field :commenter %>
  </p>
  <p class="text">
    <%= f.label :body %><br>
    <%= f.text_area :body %>      
  </p>
  <p>
    <%= f.submit %>
  </p>
<% end %>
#when .build was used
<%= @article.comments.length %> # => 2
<%= @article.comments.count %> # => 1
<%= @article.comments.size %> # => 2
<%= form_for([@article, @article.comments.build]) do |f| %>
<%= form_for([@article, @article.comments.build(commenter: "Hello!")]) do |f| %>