您好我是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感谢您的帮助
答案 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>