我是Ruby的新手,目前正在尝试实现一个AJAX风格的评论系统。
当用户查看主题时,将显示该主题的所有当前评论。
用户可以在主题的页面上发表评论,它应该自动显示,而不必刷新页面,以及自上次评论当前显示给用户以来发布的任何新评论。
评论也应该按照指定的频率自动刷新。
我目前有以下代码:
视图/想法/ view.html.erb
<%= periodically_call_remote(:update => "div_chat", :frequency => 1, :position => "top", :url => {:controller => "comment", :action => :test_view, :idea_id => @idea.id } ) %>
<div id="div_chat">
</div>
视图/评论/ test_view.html.erb
<% @comments.each do |c| %><div id="comment">
<%= c.comment %>
</div>
<% end %>
控制器/ comment_controller.rb
class CommentController < ApplicationController
before_filter :start_defs
def add_comment
@comment = Comment.new params[:comment]
if @comment.save
flash[:notice] = "Successfully commented."
else
flash[:notice] = "UnSuccessfully commented."
end
end
def test_render
@comments = Comment.find_all_by_idea_id(params[:idea_id], :order => "created_at DESC", :conditions => ["created_at > ?", @latest_time] )
@latest = Comment.find(:first, :order => "created_at DESC")
@latest_time = @latest.created_at
end
def start_defs
@latest = Comment.find(:first, :order => "created_at ASC")
@latest_time = @latest.created_at
end
end
问题是每当periodic_call_remote进行调用时,它都会返回该主题的整个注释列表。据我所知,@latest_time不断重置为最早的created_at,而不是在检索到注释后保持更新到最新的created_at。
我也不确定在发布评论时我应该如何直接刷新评论。是否可以在成功保存时强制调用periodic_call_remote?
答案 0 :(得分:1)
你必须使用远程形式的铁轨。
参考: - http://api.rubyonrails.org/classes/ActionView/Helpers/PrototypeHelper.html#M001650
提交表单时,您必须更新div。 这里没有必要更新整个div。例如: -
def add_comment#this method should called using ajax
@comment = Comment.new params[:comment]
render :update do|page|
if @comment.save
page.insert_html :top, partial=>"latest_comment", :object=>@comment
else
page << "alert('UnSuccessfully commented.')"
end
end
end
_latest_comment.hrml.erb
<%= @comment.comment %>
答案 1 :(得分:0)
在这种情况下不需要部分,你可以简单地做:
page.insert_html :top, 'div_chat', @comment.comment
尽管如此,如果您执行以下操作,我确实会看到部分使用:
views/comment/test_view.html.erb
<% @comments.each do |c| %><div id="comment"><br />
<%= render 'latest_comment', :comment => comment %><br />
</div>
<% end %>
然后在page.insert_html中你可以渲染latest_comment部分,你可以确保所有的注释都以相同的方式呈现。