Le kit du bon développeur Rails

Image non disponibleImage non disponible

Quelques gems à connaitre, partie 1

Tout bon développeur se doit d'avoir quelques outils pour créer sites et applications. À 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 avec celles-ci de tout refaire à la main à chaque fois, il existe des gems.

L'article original peut être lu sur le blog de Synbioz : Le kit du bon développeur Rails, quelques gems à connaitre, partie 1.

Commentez Donner une note à l'article (5)

Article lu   fois.

Les deux auteurs

Site personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

Authentification et gestion des utilisateurs

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

Cette fonctionnalité est particulièrement sensible en termes 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 permettent 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 e-mail par exemple.

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

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
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 un 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 :

 
Sélectionnez
gem 'cancan'

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

 
Sélectionnez
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.

 
Sélectionnez
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é :

 
Sélectionnez
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.

 
Sélectionnez
<% 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 partie. 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.

 
Sélectionnez
gem 'formtastic'

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

 
Sélectionnez
rails generate formtastic:install

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

 
Sélectionnez
<%= 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 textarea (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 :

 
Sélectionnez
gem 'ransack'

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

 
Sélectionnez
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 site afin de spécifier les critères de recherche.

 
Sélectionnez
<%= 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 ajouté 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 invoquée 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.

 
Sélectionnez
gem 'thinking-sphinx'

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

 
Sélectionnez
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 :

 
Sélectionnez
rake thinking_sphinx:index

Puis vous devez démarrer Thinking Sphinx :

 
Sélectionnez
rake thinking_sphinx:start

Enfin, vous pouvez effectuer une recherche sur vos articles :

 
Sélectionnez
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és 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 :

 
Sélectionnez
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.

 
Sélectionnez
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.

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

Vous pouvez appliquer une pagination sur une relation Active Record.

 
Sélectionnez
@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 :

 
Sélectionnez
<%= 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 et remerciements

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'entre 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. Posez-vous des questions. La gem est-elle activement maintenue ? Puis-je facilement remonter un bogue ? Y a-t-il une communauté active autour ? Est-elle bien testée ?

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

Cet article a été publié avec l'aimable autorisation de Synbioz, l'article original (Le kit du bon développeur Rails, quelques gems à connaitre, partie 1) peut être vu sur le blog de Synbioz.

Nous tenons à remercier ClaudeLELOUP pour sa relecture attentive de cet article.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2012 Synbioz. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.