允许用户在不刷新页面的情况下留下多条评论

Allow user to leave multiple comments without page refresh

本文关键字:情况下 评论 刷新 许用户 用户      更新时间:2023-09-26

在我的Rails应用程序中,用户可以在帖子上留下评论。当用户提交评论时,该代码从CommentsController:运行

def create
    @comment = Comment.new(comment_params)
    @comment.user_id = current_user.id
    @matchup = Post.find(comment_params[:post_id])
    if @comment.save  
      respond_to do |format|
        format.js
      end
    end
end

我已经设置好了,所以当创建评论时,我会在comments/create.js.erb 中运行这段代码

$("#comment-form-<%= @post.id %>").replaceWith("<%= j render partial: 'comments/comment_form', locals: {post: @post} %>"),
$("#new-comment-<%= @post.id %>").replaceWith("<%= j render partial: 'comments/comment', locals: {post: @post, comment: @comment} %>");

这将重新呈现评论表单,并在评论列表的顶部呈现用户的新评论。它非常适合第一条评论。

但是,如果用户不刷新页面并留下第二条注释,则此代码不起作用。第二条注释已创建,但仅在刷新页面时才会出现。谈到JS,我还是个新手。我错过了什么?

创建新注释时,您不需要替换原始注释dom,您可能需要在新注释之前/之后添加/预挂。请尝试更改:

$("#new-comment-<%= @post.id %>").replaceWith("<%= j render partial: 'comments/comment', locals: {post: @post, comment: @comment} %>"

收件人:

 $("#new-comment-<%= @post.id %>").before("<%= j render partial: 'comments/comment', locals: {post: @post, comment: @comment} %>"

编辑-首先进行故障排除

我想你的代码看起来不错,应该可以工作,除非你在下面遗漏了一些。因此,只需对两件事进行故障排除,即可确保问题不是小事。

如果更新视图的JavaScript代码位于函数内部,请确保format.js调用该函数而不仅仅是JavaScript文件。

像这样:

respond_to do |format|
  format.js { render :js => "my_function();" }
end

查看这篇文章以获得更详细的示例。

你可能还想看看那些和你有同样问题的人的帖子,因为很容易就能看出你是否和他们有同样的问题:

后1

后2

后3

如果上述故障排除不起作用,请查看下面的内容。


如果您希望在后端实际发生一些事情(在DB中存储注释),并在前端显示这些更改(显示新注释),而不刷新页面,那么您可能需要使用AJAX。

使用Rails,AJAX非常简单。在Rails应用程序中使用AJAX以使页面不必重新加载/刷新的过程已经在许多资源中进行了解释和概述。我找到的最好的资源就是这本指南。

由于有一些非常简单的指南非常善于解释这个过程,所以我在这里就不谈太多细节了。


看起来你已经为AJAX设置好了,只要确保你已经包含了我下面列出的所有内容。

您必须将remote: true(或早期版本的:remote => true)添加到链接/按钮中。这将允许进行AJAX调用。像这个例子:

<%= link_to 'Post Comment!', create_comments_path('params in here'), :remote => true %>

或者,如果你使用的是表单,你可以简单地将远程部分添加到提交标签:

<%= form_for [@post, Comment.new], remote: true do |f| %>

当然,根据您的控制器和视图,您的确切线路可能会有所不同。

下一步是将respond_to..format.js..块添加到您的方法中,该方法处理在DB中创建注释,或者您可能正在做的任何其他操作。我没有列出整个区块,因为你的代码中已经有了:)

请确保被调用的控制器方法都没有在respond_to..块中具有正文的format.html行。format.html很好,但format.html { #anything in here }不好。

接下来,我们需要使用makethe.js文件,该文件将用新创建的注释(或其他任何内容)重新填充视图。看起来你已经制作好了这个文件,所以我不讨论如何制作。


如果你有任何麻烦,你会从这些指南中得到最大的帮助:

  • Rails 中的Ajax和Partials

  • 调整导向

  • 使用:remote=>在Rails窗体中为true