Pagination des commentaires en AJAX avec Typo (ou n'importe quelle autre application en Ruby on Rails)

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.

Publié le 07 décembre 2008 à 22h13 Publié sous et Labels développement, ajax, accessibilité, ruby, rails, rubyonrails

À propos

Frédéric de Villamil

Je m'appelle Frédéric de Villamil, et quand je ne déploie pas ma mauvaise humeur et ma mauvaise foi sur le Web, je suis un super héros chargé de sauver le monde. Vous pouvez me suivre sur Twitter.

Soyez le premier à réagir à Pagination des commentaires en AJAX avec Typo (ou n'importe quelle autre application en Ruby on Rails)

Afin de maintenir le niveau global de ce site, les commentaires font l'objet d'une politique de modération qualitative basée sur des critères non écrits et totalement subjectifs, donc injustes.

Les commentaires écrits en langage SMS, inutiles, déplacés, injurieux ou relevant du spam seront systématiquement supprimés sans avertissement préalable.

Les trackbacks sont fermés pour cause de spam.