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