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 :
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 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 :
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 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.
gem 'formtastic'
Ensuite, il vous faut installer la gem grâce à la commande suivante :
rails generate formtastic:
install
À 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 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 :
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 site 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 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.
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é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 :
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 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.