允许用户在不刷新页面的情况下留下多条评论
Allow user to leave multiple comments without page refresh
在我的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
- 如何在未直接触发的情况下停止事件
- 在不使用JQuery的情况下隐藏DOM中的选定元素
- 在不使用jquery的情况下查找页面中的所有锚点并附加函数
- 在不打开聊天屏幕的情况下制作Zopim-ding代理
- 在不阻止默认行为的情况下检测IE10中的缩放
- 如何在不传递此信息的情况下查找被调用的元素
- 如何在不刷新页面的情况下更新显示框
- 有没有一种方法可以在控制台关闭的情况下让console.log()在IE中记录消息
- JavaScript-在手机上不工作的情况下,在外部单击时隐藏元素
- 在我的情况下,如何进行http请求
- 在不知道深度或父属性的情况下从对象中删除属性
- 在不破坏未定义函数的情况下,对多个视图使用单个js文件
- ROR:如何在不重新加载浏览器的情况下从控制器获取参数
- 如何在不影响其他元素的情况下扩展DIV
- 如何在内联依赖项并将图像转换为dataURI的情况下完全提取网页
- 在不移动内部文本的情况下缩放元素的效果
- 在不设置协议的情况下,使用javascript/jquery更改iframe-src
- 允许用户在不刷新页面的情况下留下多条评论
- 我可以在不丢失旧评论的情况下设置disqus_identifier吗?动态
- 我可以在没有访问令牌的情况下从instagram照片中获取所有评论吗?