自上次检查Rails以来,仅返回新的数据库项

时间:2010-04-03 10:31:00

标签: ruby-on-rails controller

我是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?

2 个答案:

答案 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部分,你可以确保所有的注释都以相同的方式呈现。