Créer un index filtré

Ce document présente comment réaliser une implémentation d’index filtré dans l’admin d’Osuny.
Pour avoir une vue plus globale et théorique de la mécanique, se référer à la page d’architecture.

Controllers :

Dans l’action d’index ajouter un scope .filter_by(params[:filters], current_language).

Views :

  • Dans l’index.html.erb ajouter une ligne <%= render 'filters', current_path: admin_ROUTE_VERS_L_INDEX_path %>
  • Créer à côté un partial _filters.html.erb Le fichier de filtre doit avoir cette structure :
<%= simple_form_for :filters, url: current_path, method: :get do |f| %>
  <%= filters_panel current_path: current_path, active_filters_count: active_filters_count do |form| %>

    <%= render_filter f,
                      :string,
                      :for_search_term,
                      label: t('search')
                      %>

    # ET LES DIFFERENTS FILTRES

    <% end %>
<% end %>

Models :

  • Include le concern Filterable : include Filterable
  • Créer les scopes dont on a besoin, en rapport avec le contenu mis dans la vue de _filters.html.erb. Tous ces copes créés doivent avoir un 2ème paramètre language optionnel. J’ai pris l’habitude d’avoir des scopes dédiés aux filtres qui commencent pas for_xxx. Ca donne des scope comme ceci par exemple :
scope :for_search_term, -> (term, language) {
  joins(:university)
    .joins(:localizations)
    .where(communication_website_localizations: { language_id: language.id })
    .where("
      unaccent(universities.name) % unaccent(:term) OR
      unaccent(communication_website_localizations.name) % unaccent(:term) OR
      unaccent(communication_websites.url) % unaccent(:term)
    ", term: "%#{sanitize_sql_like(term)}%")
}

ou

scope :for_about_type, -> (about_type, language = nil) {
  where(about_type: about_type)
}