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 will_paginate au lieu de classic_pagination.

Dans un premier temps, nous allons ajouter le support des liens en AJAX à will_paginate, en réutilisant le code proposé par Redline Software. Nous allons tout simplement surcharger la classe LinkRenderer utilisée par will_paginate 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

Mots clés développement, ajax, accessibilité, ruby, rubyonrails, rails

Si cet article vous a plu, suivez-moi sur Twitter Suivez-moi sur Twitter

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

Merci de vous exprimer dans un français correct. Les commentaires déplacés, injurieux et le spam seront supprimés.

Les trackbacks sont fermés pour cause de spam.


Abonnez-vous au flux RSS et suivez les nouveaux articles du site Suivez-moi sur Twitter