2010-04-03 8 views
0

Je suis relativement novice en ce qui concerne Ruby et j'essaie actuellement de mettre en œuvre un système de commentaires de style AJAX.Renvoie uniquement les nouveaux éléments de la base de données depuis la dernière vérification Rails

Lorsque l'utilisateur affiche un sujet, tous les commentaires actuels sur ce sujet seront affichés.

L'utilisateur peut poster un commentaire sur la page d'un sujet et il devrait automatiquement afficher sans avoir à actualiser la page, avec tous les nouveaux commentaires qui ont été postés depuis le dernier commentaire actuellement affiché à l'utilisateur.

Les commentaires doivent également être actualisés automatiquement à une fréquence spécifiée.

J'ai actuellement le code suivant:

vues/idée/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> 

vues/commentaire/test_view.html.erb

<% @comments.each do |c| %><div id="comment"> 
<%= c.comment %> 
</div> 
<% end %> 

contrôleurs/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 

Le problème est que chaque fois que periodically_call_remote appelle, il renvoie la liste complète des commentaires pour ce sujet. D'après ce que je peux dire, @latest_time est constamment réinitialisé au plus tôt created_at, plutôt que de rester à jour avec le dernier created_at après que les commentaires ont été récupérés.

Je ne sais pas non plus comment je devrais actualiser directement les commentaires lorsqu'un commentaire est posté. Est-il possible de forcer un appel à periodically_call_remote sur une sauvegarde réussie?

Répondre

1

Vous devez utiliser une forme de rails à distance.

Ref: - http://api.rubyonrails.org/classes/ActionView/Helpers/PrototypeHelper.html#M001650

Lorsque vous soumettez le formulaire que vous devez mettre à jour la div. ici pas besoin de mettre à jour div entier. Ex: -

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 %> 
+0

a déplacé ce commentaire à une nouvelle réponse afin de le formater. –

0

pas besoin d'une partielle dans ce cas, vous pouvez simplement faire:

page.insert_html :top, 'div_chat', @comment.comment 

Bien que, je ne voir l'utilisation d'un partiel si vous faisiez ce qui suit:

views/comment/test_view.html.erb 

<% @comments.each do |c| %><div id="comment"><br /> 
<%= render 'latest_comment', :comment => comment %><br /> 
</div> 
<% end %> 

Ensuite, dans page.insert_html vous pourriez rendre partial_comment partial et vous assurer que tous les commentaires sont rendus de la même manière.

Questions connexes