Blog : pagination des commentaires en Ajax, avec Ruby on Rails

Voici comment aboutir à une pagination des commentaires dans une application Ruby on Rails. Exemple avec Typo : un outil de blogs basé sur cette infrastructure de développement.

Si Wordpress propose la pagination des commentaires, alors pourquoi pas Typo, le blogware en Ruby on Rails qui équipe de nombreux sites ? Ce didacticiel s'applique à la version en cours de développement de Typo, qui utilise pour la pagination willpaginate au lieu de classicpagination, mais pourrait être étendu à toute application reposant sur Ruby on Rails.

Dans un premier temps, nous allons ajouter le support des liens en Ajax à willpaginate, en réutilisant le code proposé par Redline Software.

# app/helpers/remote_link_renderer.rb 
 

class RemoteLinkRenderer < WillPaginate::LinkRenderer 
 def prepare(collection, options, template) 
    @remote = options.delete(:remote) || {} 
   super 
 end 
 




protected 
  def page_link(page, text, attributes = {})      
 @template.link_to_remote(text, {:url => url_for(page), :method => :get}.merge(@remote)) 
   end 
end

Nous allons tout simplement surcharger la classe LinkRenderer utilisée par willpaginate afin d'afficher les liens.

 # app/controllers/articles_controller.rb 
def show 
 @article = this_blog.requested_article(params) 
 
 @comment = Comment.new 
 @comments = @article.published_comments.paginate(:page => params[:page], :per_page => 10) 
 @page_title = @article.title 
 article_meta 



 

 auto_discovery_feed 
 respond_to do |format| 
   format.html { render :action => ?read? } 
   format.atom { render :partial => ?articles/atom_feed?, :object => @article.published_feedback } 
   format.rss { render :partial => ?articles/rss20_feed?, :object => @article.published_feedback } 
   format.xml { redirect_to :format => ?atom? } 
 end 
 rescue ActiveRecord::RecordNotFound 
   error("Post not found?") 
end

Il ne nous reste plus qu'à modifier le rendu des commentaires, côté vues, cette fois. Je pars du principe que vous utilisez un des thèmes par défaut, sinon il vous faudra adapter.

 # themes/votretheme/views/articles/_comment_list.html.erb 
<ol id="commentList" class="comments"> 
 <% if @comments.any? -%> 
   <%= render(:partial => "comment", :collection => @comments) %> 
 <% else -%> 
   <li class="dummy_comment" style="display:none"><%= _("No comments")%></li> 
 <% end -%> 



 

</ol> <%= will_paginate @comments, :renderer => ?RemoteLinkRenderer? , :remote => {

Et la cerise sur le gâteau, c'est que si vous n'avez pas JavaScript activé, ça marche aussi.

Tutoriel réalisé par Frédéric de Villamil, sous licence Creative Commons