Quand j’ai lu il y a une vingtaine de minutes que Wordpress 2.7 proposait (enfin) la pagination des commentaires, mon sang n’a fait qu’un tour : si Wordpress le fait, pas question que Typo, le blogware en Ruby on Rails qui équipe ce site et bien d’autres ne le fasse pas. 10 minutes plus tard, j’avais un truc fonctionnel, que je ne peux m’empêcher de partager avec vous, parce que vous le valez bien ©

Ce didacticiel s’applique à la version en cours de développement de Typo, qui utilise pour la pagination willpaginate au lieu de classicpagination.

Dans un premier temps, nous allons ajouter le support des liens en AJAX à willpaginate, en réutilisant le code proposé par Redline Software. Nous allons tout simplement surcharger la classe LinkRenderer utilisée par willpaginate afin d’afficher les liens.

# 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 ensuite ajouter la pagination aux commentaires d’un billet. Pour cela, nous allons éditer la méthode show du contrôleur Articles :

# 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 => { :update => 'commentList'} %>

Et la cerise sur le gâteau, c’est que si vous n’avez pas Javascript activé, ça marche aussi. Quant à moi, il ne vous reste plus qu’à aller écrire quelques specs, tester un peu, et commiter tout ça avant de sombrer dans les bras de Morphée.

Perry the Platypus wants you to subscribe now! Even if you don't visit my site on a regular basis, you can get the latest posts delivered to you for free via Email: