Le kit du bon développeur Rails, quelques gems à connaitre, partie 1

Publié le 28 décembre 2011 par Alexandre Salaun | outils

Cet article est publié sous licence CC BY-NC-SA

Tout bon développeur se doit d’avoir quelques outils pour créer sites et applications. A l’instar d’un mécanicien et de sa trousse à outils, un développeur Rails a son lot de gems indispensables.

Il existe différentes fonctionnalités que l’on va retrouver sur une très grande majorité des sites ou applications web. Il n’est pas nécessaire pour celles-ci de tout refaire à la main à chaque fois, il existe des gems.

Authentification et gestion des utilisateurs

L’une des premières fonctionnalités demandée lors de la création d’un site est l’authentification d’utilisateur.

Cette fonctionnalité est particulièrement sensible en terme de sécurité, vouloir tout refaire à la main, c’est à coup sûr exposer son client à une faille.

Généralement l’utilisateur doit pouvoir créer un compte, se connecter, se déconnecter, etc… ; nous allons donc découvrir l’une des gems qui permet de gérer tout cela.

Devise

Devise est une gem disponible pour Rails 2.3 et Rails 3. Différents modules sont disponibles suivant les besoins que vous avez. Il est possible de valider les créations de compte avec un email par exemple.

Pour utiliser cette gem dans votre application il suffit de l’ajouter à votre Gemfile :

gem 'devise'

Puis, un bundle install suffit à installer Devise. Ensuite, il vous faut configurer cette gem avant de pouvoir l’utiliser. Pour cela, il vous faut lancer la commande suivante :

rails generate devise:install

Enfin, vous pouvez créer votre MODEL (que nous appelons ici USER mais vous pouvez choisir le nom que vous souhaitez) avec Devise pour pouvoir gérer des utilisateurs :

rails generate devise USER

Suite à ceci, vous allez donc avoir un model User, ainsi qu’une migration pour créer la table en base et également de nouvelles routes dans votre fichier routes.rb. Il est maintenant possible pour une utilisateur de créer un compte, de se connecter, etc…

Vous pouvez ensuite configurer le fonctionnement afin de répondre aux fonctionnalités souhaitées.

Si vous souhaitez aller plus loin avec Devise, vous pouvez consulter le Railscast de Ryan Bates.

Devise n’est pas la seule gem capable de vous aider en ce qui concerne la gestion d’utilisateurs. En effet, il existe également d’autres gems telles que Authlogic par exemple.

Il est également possible que vous ayez besoin de permettre aux utilisateurs de se connecter via différents autres sites ou outils existants (Facebook, Twitter, LDAP…). Pour vous y aider, il y a OmniAuth ; vous permettant d’intégrer la connexion via les réseaux sociaux sur votre site ou application web.

Maintenant que nous avons vu comment permettre à un utilisateur de se connecter sur votre site, vous pouvez avoir besoin de gérer des droits d’accès en définissant des rôles.

Cancan

Cancan est une gem permettant de gérer les autorisations et les droits d’accès à certains contenus. En effet, vous pouvez définir ce qui est disponible ou non pour l’utilisateur connecté. Cette gem fonctionne parfaitement avec Devise ou Authlogic par exemple.

Pour installer cette gem, si vous utilisez Rails 3, il vous suffit de l’ajouter dans votre Gemfile :

gem 'cancan'

Si vous utilisez Rails 2, vous devez ajouter cette ligne dans votre fichier environment.rb (après avoir installé la gem) :

config.gem "cancan"

Ensuite, il vous faut ajouter un champ role à votre model User. Puis, il faut définir une classe Ability_où se trouveront les permissions des utilisateurs. Si l’on a par exemple, des utilisateurs avec un rôle _admin ou author, on initialise les droits en fonction de ce rôle.

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new
    send user.role
  end

  def admin
    can :manage, :all
  end

  def author
    can [:create, :read, :update], [Article, Dossier]
  end
end

Ici, l’admin a tous les droits alors que l’author ne peut que créer, lire ou modifier des Dossiers et Articles.

Vous pouvez contrôler les autorisations depuis le controller, par exemple pour vérifier si l’utilisateur connecté peut voir l’article qu’il a sélectionné :

def show
  @article = Article.find(params[:id])
  authorize! :read, @article
end

Ou bien, vous pouvez afficher un bloc dans une vue uniquement si l’utilisateur possède les droits nécessaires.

<% if can? :read, @article %>
  <%= link_to "Voir l'article", article_path(@article) %>
<% end %>

Vous pouvez également gérer les erreurs lorsque l’utilisateur n’a pas accès à une page par exemple. Plus de détails sont disponibles sur le Github de Cancan.

Créer des formulaires

La gestion des utilisateurs n’est pas le seul point indispensable d’un site. La création de formulaires en fait également parti. Il est nécessaire d’avoir des formulaires pour créer ou éditer différents objets, pour se connecter… Il existe donc différentes gems pour vous aider à créer vos formulaires.

Formtastic

Formtastic est une gem qui vous permet, à travers un DSL, de créer des formulaires. Cette gem est compatible avec Rails 2 et 3.

Pour pouvoir utiliser Formtastic dans votre projet, vous devez l’ajouter dans votre Gemfile puis lancer un bundle install.

gem 'formtastic'

Ensuite, il vous faut installer la gem grâce à la commande suivante :

rails generate formtastic:install

A partir de là, vous pouvez utiliser cette gem dans vos vues pour créer vos formulaires.

<%= semantic_form_for @article do |f| %>
  <%= f.inputs do %>
    <%= f.input :title %>
    <%= f.input :content, :input_html => { :class => 'article_content', :rows => 5, :cols => 50 }%>
    <%= f.input :draft, :as => :radio %>
    <%= f.input :categories, :as => :select, :collection => Categorie.find(:all) %>
  <% end %>
  <%= f.buttons do %>
    <%= f.commit_button %>
  <% end %>
<% end %>

Dans le cas présent, on crée un formulaire pour un article avec un champ title qui est un input de type text, un champ content qui est un text_area (pour lequel on spécifie des options), un champ draft qui est un bouton radio et enfin un champ categories qui est un select. Enfin, on retrouve le bouton de validation du formulaire. Il vous est possible de créer une multitude d’options pour mettre en forme votre formulaire selon vos souhaits.

En plus de vous simplifier la tâche, Formtastic génère un code sémantiquement riche. Il ajoute également des balises HTML5 telles que phone, email… On y retrouve également une gestion des messages d’erreurs.

Formtastic n’est pas la seule gem qui permet une création simplifiée des formulaires. En effet il existe aussi simple_form par exemple. Encore une fois, vous pouvez choisir celle qui vous convient le mieux par rapport à vos besoins et vos habitudes.

Moteur de recherche

Sur un site ayant un contenu suffisamment important, il peut être nécessaire d’avoir un moteur de recherche.

Ransack

Ransack est un outil qui vous permet de créer un moteur de recherche sur votre site. Il vous permet de gérer vos recherches selon deux types simple ou avancé (advanced). Pour l’utiliser, il vous faut tout d’abord l’ajouter à votre Gemfile :

gem 'ransack'

Ensuite, vous pouvez créer une recherche comme dans l’exemple ci-dessous :

def index
  @q = Article.search(params[:q])
  @articles = @q.result
end

On effectue une recherche sur les articles avec les paramètres transmis par un formulaire de recherche puis on retourne les articles correspondants.

Il faut également créer ce formulaire de recherche dans votre afin de spécifier les critères de recherche.

<%= search_form_for @q do |f| %>
  <%= f.label :title_start %>
  <%= f.text_field :title_start %>
  <%= f.label :content_cont %>
  <%= f.text_field :content_cont %>
  <%= f.submit %>
<% end %>

On utilise le DSL pour savoir si le contenu d’un article contient bien l’expression donnée (avec cont ajouter au nom du champ) ou bien si le titre commence par un mot ou une expression donnée (avec start ajouté au nom du champ). Il existe de nombreux critères pour effectuer votre recherche.

Encore une fois, il n’y a pas une seule et unique gem pour faire cela. Ransack est une réécriture de MetaSearch et d’autres gem existent.

Thinking Sphinx

Pour les applications nécessitant un moteur de recherche plus performant, vous pouvez utiliser le logiciel Sphinx. Celui-ci est un moteur de recherche indépendant de votre application Rails, il ne fait que génèrer un index à partir de la base de données. Cette indexation ne se fait d’ailleurs pas automatiquement, elle doit être invoquer régulièrement (par exemple via un cron). Afin de faire le lien entre votre application (en l’occurrence Active Record) et Sphinx, il existe une gem Thinking Sphinx.

Cette dernière vous propose un certain nombre d’options afin de gérer vos recherches. Vous pouvez par exemple configurer une taille minimum pour les mots ou encore effectuer une recherche sur des morceaux de mots.

Pour installer cette gem, il vous suffit de l’ajouter à votre Gemfile.

gem 'thinking-sphinx'

Ensuite, il vous faut définir les champs sur lesquels la recherche va s’effectuer pour le model que vous souhaitez.

class Article < ActiveRecord::Base
  define_index do
    indexes title, :sortable => true
    indexes content

    has created_at, updated_at
  end
end

Deux méthodes sont utilisées. La première, indexes, permet d’indexer les champs pour lesquels on pourra effectuer une recherche. La deuxième, has, permet de définir des attributs. Ils permettent de faire un tri par exemple.

Ensuite, il faut lancer l’indexation des champs grâce à la tâche rake suivante :

rake thinking_sphinx:index

Puis vous devez démarrer Thinking Sphinx :

rake thinking_sphinx:start

Enfin, vous pouvez effectuer une recherche sur vos articles:

Article.search "un article", :order => :created_at, :sort_mode => :desc
# on cherche les articles contenant dans leur titre ou contenu l'expression "un article"
# et trié par ordre décroissant sur le critère "created_at".

Il vous est donc possible d’effectuer des recherches sur un model donné. Vous pouvez obtenir beaucoup de détails sur le site de Thinking Sphinx.

Pagination

Certaines pages de votre site peuvent contenir des listes de résultats très longues et dans ce cas, il vaut mieux utiliser la pagination afin d’éviter les pages qui n’en finissent plus.

Will Paginate

Will Paginate est une gem permettant de paginer vos résultats très simplement.

Pour installer will_paginate_ dans une application Rails 3, il vous faut ajouter la gem dans votre Gemfile :

gem 'will_paginate', '~> 3.0'

Ensuite, il vous suffit de spécifier, dans votre controller, que les résultats sont paginés tout en indiquant les paramètres correspondants.

def index
  @articles = Article.paginate(:page => params[:page])
  # on indique la page sur laquelle l'utilisateur se trouve
end

Il est également possible de spécifier le nombre de résultats par page.

@articles = Article.paginate(:page => params[:page], :per_page => 20))

Vous pouvez appliquer une pagination sur une relation Active Record.

@articles = Article.where(:draft => false).paginate(:page => params[:page], :per_page => 20))

Enfin, il faut ajouter la gestion des pages dans votre vue et pour cela il vous faut uniquement ajouter le bloc suivant:

<%= will_paginate @articles %>

Ceci aura pour effet d’ajouter dans votre vue html un bloc contenant des liens vers les pages suivantes et précédentes ainsi que quelques liens directs vers des pages précises. Il est possible de configurer l’affichage du sélecteur de page dans votre vue.

De nombreux paramètres sont à votre disposition pour obtenir ce qui convient le plus à vos besoins.

Afin d’effectuer une pagination sur votre site ou application vous pouvez également utiliser la gem kaminari.

Déploiement

Le déploiement d’une application ou d’un site web n’est pas la partie la plus simple. Dans ce cas encore, l’usage d’une gem pour vous faciliter la tâche peut s’avérer utile.

Capistrano

Capistrano est un outil permettant d’exécuter des commandes sur différentes machines distantes.

On utilise pour cela un DSL afin de définir différentes tâches à exécuter. Celles-ci sont définies dans un fichier (capfile).

Une fois que vous avez créé votre fichier et que vous avez renseigné les différentes tâches à accomplir, il faut savoir sur quelles machines vous voulez déployer votre site ou application. Ceci se fait dans le fichier deploy.rb du répertoire config de votre projet. Vous pouvez obtenir plus de détails sur la façon d’utiliser capistrano dans notre article concernant le déploiement.

Conclusion

Il existe donc de nombreuses gems qui vont vous faciliter la tâche lors de l’ajout de fonctionnalités de base. Pour chacune d’entres elles, différentes gems peuvent être utilisées.

Il n’y a pas une gem parfaite dans chaque cas, c’est à vous de choisir celle qui vous semble la plus appropriée et qui vous convient le mieux.

Investissez le temps que vous ne passerez pas à développer à bien choisir vos outils et lire leur code. La gem est elle activement maintenue, puis je facilement remonter un bug, y a t-il une communauté active autour, est-elle bien testée ?

Cet investissement en veille, à l’affut des bons outils, vous sera largement récompensé à chaque fois que vous trouverez chaussure à votre pied.

L’équipe Synbioz.

Libres d’être ensemble.