Ruby on Rails, pagination et paramètres de filtrage

Le 30 Apr 2008 à 00h03 | Catégorie : | 3 commentaires

Je viens de terminer la mise en place d’options de filtrage sur les différents tableaux de classement de l’administration de Typo, pour les billets, les pages, et les pièces jointes.

tableau de classement de Typo

Une des difficultés était de passer les paramètres de filtrage d’une page à l’autre via la plugin classic_pagination, sans ajouter une quantité considérable de code. Chaque tableau dispose en effet de ses propres filtres, et si on peut retrouver certaines similitudes d’un controller à l’autre, ce n’est pas toujours le cas.

Pour ce faire, j’ajoute un helper nommé params_qsa dans chaque controller à traiter. Ce dernier contiendra l’ensemble des paramètres à ajouter à la requête GET pour effectuer la recherche. Lesdits paramètres sont ensuite traités dans le module de recherche pour éviter les attaques.

def params_qsa
  { 'search[category]' => @search[:category], 
    'search[user_id]' => @search[:user_id], 
    'search[published_at]' => @search[:published_at], 
    'searched[published]' => @search[:published] }
end

Dans chaque controller à traiter, j’ai déclaré une variable de class @search, qui contient la liste des paramètres envoyés par le formulaire de recherche.

@search = params[:search]

Pour finir, je vais utiliser un partial, que j’appellerai en bas de chacun des tableaux, et qui affichera les liens précédent, suivant, et les liens vers les différentes pages.

link_to "Page précédente", :id => pages.current.previous, :params => params_qsa  if pages.current.previous    
pagination_links pages, {:name => 'id' , :params => params_qsa}
link_to "Page suivante", :id => pages.current.next, :params => params_qsa  if pages.current.next

Et voilà, c’est fait. Si vous avez plus propre, je suis évidemment preneur, sachant que je ne suis en aucun cas adepte du refactoring par le vide ;-).

Commenter »

  1. NiKo about 8 hours later:

    Huhu, c’est peu ou prou la même astuce que j’ai utilisé sur Symfonians : http://symfonians.org/browser/trunk/apps/main/modules/applications/actions/actions.class.php#L196

    (ne vomis pas, c’est du php ;)

  2. Eric about 11 hours later:

    Je n’a pas de solutions mais je suis curieux de savoir ce que tu proposes comme choix pour les dates. Je me suis toujours retenu de faire des filtres simples pour les dates, parce que je n’ai jamais rien trouvé qui cadre avec au moins la moitié des cas d’utilisations :

    • par mois ? janvier 2008, février 2008, … ce n’est pas idiot pour un blog
    • par proximité ? moins d’une semaine, moins d’un mois, moins de trois mois … c’est souvent comme ça qu’on se rappelle d’un vieux contenu (et pas par son mois)
    • par éloignement ? plus d’une semaine, plus d’un mois, plus de trois mois … si on fonctionne par proximité on doit aussi certainement souvent fonctionner par éloignement
    • par période ? entre une semaine et un mois, entre un et trois mois …. encore une méthode utile

    J’ai eu beau chercher et demander à des gens comment ils cherchent (hors contexte informatique, pour ne pas mélanger avec le simple “d’ordinaire c’est comme ça”), je n’ai pas pu écarter un des quatre cas ni en mettre un particulièrement en avant.

    Qu’as tu priviligié et pourquoi ?

  3. Frédéric de Villamil about 12 hours later:

    @Nicolas : j’ai un instant cru que c’était du Perl2EE, un mélange de Perl (beurk) et de J2EE. Mais non…

    Eric : J’ai opté pour un filtrage par mois pour plusieurs raisons :

    • Même si tu blogues depuis 4 ans, la taille de la liste reste raisonnable.
    • La pagination se faisant par 20 billets, cela restreint le nombre de pages pour un filtrage par mois, même si tu publies énormément.
    • Si tu cherches du contenu précis, il y a une recherche fulltext.

    Enfin je doute que ce mode de filtrage soit vraiment utilisé. En tout cas, je ne l’utilise pas, sauf à des fins statistiques. Simplement, les gens risquent de s’étonner s’il n’est pas présent.

Laisser un commentaire

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.