基于我的代码顺序的不同输出(Rails)

时间:2015-07-31 17:54:05

标签: ruby-on-rails controller

我正在做导轨教程,而我只是将评论模型与我的文章模型相关联。

我有一个视图文件,在这里显示一篇文章及其所有评论(app / views / articles / show.html.erb):

<p>
  <strong>Title:</strong>
  <%= @article.title %>
</p>

<p>
  <strong>Text:</strong>
  <%= @article.body %>
</p>

<h2>Comments</h2>
<% @article.comments.each do |comment| %>
    <p>
        <strong>Commenter:</strong>
        <%= comment.commenter %>
    </p>

    <p>
        <strong>Body:</strong>
        <%= comment.body %>
    </p>
<% end %>

<h2>Add a comment:</h2>
<%= form_for([@article, @article.comments.build]) do |comment| %>
    <p>
        <%= comment.label :commenter %>
        <%= comment.text_field :commenter %>
    </p>
    <p>
        <%= comment.label :body %>
        <%= comment.text_area :body %>
    </p>
    <p>
        <%= comment.submit %>
    </p>
<% end %>

代码排列如下 - 添加评论表单上方显示的评论 - 浏览器中的所有内容都显示正常

但是,当我重新排列以在评论部分上方添加评论表时,如下所示:

<p>
  <strong>Title:</strong>
  <%= @article.title %>
</p>

<p>
  <strong>Text:</strong>
  <%= @article.body %>
</p>



<h2>Add a comment:</h2>
<%= form_for([@article, @article.comments.build]) do |comment| %>
    <p>
        <%= comment.label :commenter %>
        <%= comment.text_field :commenter %>
    </p>
    <p>
        <%= comment.label :body %>
        <%= comment.text_area :body %>
    </p>
    <p>
        <%= comment.submit %>
    </p>
<% end %>

<h2>Comments</h2>
<% @article.comments.each do |comment| %>
    <p>
        <strong>Commenter:</strong>
        <%= comment.commenter %>
    </p>

    <p>
        <strong>Body:</strong>
        <%= comment.body %>
    </p>
<% end %> 

我在页面底部留下了一个标有评论者和正文的html元素,但其中没有任何内容。例如,如果我在文章上发表了一次评论,那么它会显示预期评论,还会在其下方添加一条空白评论。在最初的代码安排中,没有额外的空白评论,只有我在文章中写的单一预期评论。

为什么重新排列这样的文字会在底部添加空白评论?

我的文章控制器显示行动:

def show
    @article = Article.find(params[:id])
end

我的评论控制器创建动作:

def create 
    @article = Article.find(params[:article_id])    
    @comment = @article.comments.create(comment_params)

    redirect_to article_path(@article)
end

1 个答案:

答案 0 :(得分:0)

一旦你这样做了(你在表格中做了什么)

@article.comments.build

它初始化对@article的评论,然后当您尝试获取表格中下面文章的评论时,也会显示该相关评论。你要做的是,用这个

更新下面的表格
<% @article.comments.select(&:persisted?).each do |comment| %>
    <p>
        <strong>Commenter:</strong>
        <%= comment.commenter %>
    </p>

    <p>
        <strong>Body:</strong>
        <%= comment.body %>
    </p>
<% end %> 

主线变化是这个

<% @article.comments.select(&:persisted?).each do |comment| %>

这将仅选择该文章的数据库中存在的那些评论