将局部变量传递给 create.js.erb 以进行迭代中的迭代

Pass local variable to create.js.erb for an iteration in an iteration

我有一个 Post 和一个 Comment 模型,而 post 可以有多个评论,一个评论属于 post(和一个用户)。

我正在通过执行 @posts.each do |d| 遍历所有 Post,这不是什么大问题。此外,我正在遍历 d.comments.each do |comment| 的 Post 的所有评论。也没什么大不了的。

我设置了 create.js.erb 以使我的应用程序更加动态,并立即显示您在 post 下创建的评论。虽然我的表单工作正常,但我在设置 create.js.erb 时遇到了麻烦,它在提交表单内容时给我一个 NameError - undefined local variable or method 'comment' for #<Class:> Did you mean? @comment:。重新加载页面后,评论已添加,但我希望像单页应用程序那样进行即时更新。我以前从未与 ajax 合作过。

如果我只是在单独的 posts#show 视图上显示评论,我将能够解决整个问题,但因为我正在遍历索引页面上的每个 post 并想要显示每个 post 的每条评论以及异步更新评论我只是不知道该怎么做。

如何创建所需的行为?

抱歉,如果我的问题被问得有点靠不住。

comments_controller.rb

  def create
    @user = current_user
    @comment = Comment.new(comment_params)
    @comment.user_id = @user.id

    respond_to do |format|
      if @comment.save
        format.js {}
        format.html { redirect_to root_path, notice: 'Comment added' }
        format.json { render :show, status: :created, location: @comment }
      else
        format.html { redirect_to root_path }
        format.json { render json: @comment.errors, status: :unprocessable_entity }
      end
    end
  end

posts/index.html.erb

<% @posts.each do |d| %>
  <%= d.content %>

  <div class="comment-list">
    <%= render partial: "comments/comment", collection: d.comments %>
  </div>
<% end %>

comments/_comment.html.erb

<%# d.comments.reverse.each do |comment| %>
  <%= comment.content %>
<%# end %>

create.js.erb

$(".comment-list").append("<%= j render partial: "comments/comment" %>");
$(".comment-list").append("<%= j render partial: "comments/comment" %>");

将上面的代码替换为

$(".comment-list").append("<%= j render partial: "comments/comment", locals: {comment: @comment} %>");