在@comments - Rails的显示页面上显示评论表单,停止新的@comment

时间:2015-01-04 18:43:00

标签: ruby-on-rails ruby comments polymorphic-associations

您好我是Rails的新手,我只是为我的Shop_Profile模型设置评论。我使用acts_as_commentable gem来允许多态注释。我允许对个人资料显示页面发表评论,所以我在同一页面上显示评论列表和新评论表单。

ShopProfilesController中的My Show Action如下所示:

def show
    @comments = @shop_profile.comments
    @comment = @shop_profile.comments.new
  end

我正在使用以下方式在展示视图中呈现评论表单和评论:

<% if user_signed_in? %>
    <%= render 'comments/form' %>
<% end %>

<%= render @comments %>

我的评论控制器上的“我的创建”操作是:

def create
    @comment = @user.comments.build(comment_params)
    @commentable = Comment.find_commentable(params[:comment][:commentable_type], params[:comment][:commentable_id])

    if @comment.save
      redirect_to @commentable
    end
  end

我的_comment部分是:

<p>
  <strong>Title:</strong>
  <%= comment.title %>
</p>

<p>
  <strong>Comment:</strong>
  <%= comment.comment %>
</p>

<p>
  <small>By:</small>
  <%= comment.user.username %>
</p>

表单的新@comment一直包含在@comments中,因此导致错误&#34;未定义的方法`用户名&#39;对于nil:NilClass&#34; 因为新的@commentn没有 user_id 。 如何在不包含form_for?

的新@comment的情况下显示我的@comments

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

您正在集合中创建其他评论,并且新评论尚未关联用户,并且尚未保存在数据库中。

如果您希望完全跳过新评论,可以执行以下操作:

<%= render @comments.reject{|c| c == @comment } %>

如果您希望新评论显示,但跳过“按”部分,则可以执行此操作:

<% if comment != @comment %>
  <p>
    <small>By:</small>
    <%= comment.user.username %>
 </p>
<% end %>

答案 1 :(得分:1)

不幸的是(在这种情况下)new / build将构建的对象添加到关联的集合中。因此,您需要声明您希望@comments集合中存储在数据库中的项目的意图。

我知道两个选项:

def show
  @comment = @shop_profile.comments.new
  @comments = @shop_profile.comments(true)
end

这会强制@comments干净地加载,因此它只包含原始列表。不幸的是,您在同一个列表中两次访问数据库,这很愚蠢。

我认为更好,因为这样做:

def show
  @comments = @shop_profile.comments.to_a
  @comment = @shop_profile.comments.new
end

现在,您通过将@comments集合作为一个数组来从活动记录关联中分离出来,因此稍后new调用不会修改您仍在保留的任何内容。< / p>