Aujourd’hui je vais vous présenter 2 gems que j’ai trouvé très pratiques sur de précédents projets: CapistranoDbTasks et Gon.
CapistranoDbTasks comme son nom l’indique apporte quelques tâches supplémentaires pour gérer les bases de données au travers de Capistrano, mais aussi des tâches pour gérer les assets. L’intérêt est donc de pouvoir synchroniser les données et les assets locales et distantes au travers de Capistrano.
Gon quant à elle, est un pont entre les données en back et le Javascript. Elle simplifie grandement le processus de passage de données d’un contrôleur aux fichiers Javascript, sans avoir à les parser ou à exécuter une requête ajax supplémentaire lors du premier rendu d’une page.
Pour ma part, la partie qui m’est la plus utile est la synchronisation de la base de données distante vers ma base locale. Très pratique pour générer des dumps des données du serveur de staging ou de production, ainsi que pour avoir les mêmes données que vos interlocuteurs.
Pour l’intégrer à votre projet Rails, vous devez ajouter la gem à votre Gemfile et compléter votre config/deploy.rb
avec les options qui vous sont utiles. Les options disponibles sont présentes sur le Readme.
Pour mon usage, c’est à dire récupérer des dumps de la base distante et travailler avec, voici les options que j’ai utilisé :
require 'capistrano-db-tasks'
# remove the dump file from the server after downloading
set :db_remote_clean, true
# prevent any push operation to the server
set :disallow_pushing, true
Lorsque je récupère un dump de la base distante, je veux qu’il soit supprimé après avoir été téléchargé, et je préfère verrouiller la fonction de push de ma base locale vers la distante, on ne sait jamais.
Maintenant lorsque je lance la tâche :
cap production db:pull
Mes données locales reflètent les données présentes en production, et un fichier dump se trouve dans le dossier db
.
Au total, 6 tâches sont proposées pour la synchonisation des bases de données et des assets dont voici la liste.
Un petit bémol tout de même, actuellement cette gem ne supporte que les bases MySQL et PostgreSQL. Il faut donc la forker et la compléter pour d’autres types de bases de données.
Avec Gon on peut très simplement passer des données d’un contrôleur Rails au Javascript, en même temps que le rendu de la page.
Une fois intégré à votre projet, on a accès à un objet Gon
dans nos contrôleurs, sur lequel nous n’avons plus qu’à définir les variables destinées au Javascript comme suit :
gon.foo = "foo"
gon.push({ bar: "bar" })
Ensuite un simple :
<%= Gon::Base.render_data %>
dans la vue à partir de laquelle notre Javascript est exécuté, et toutes les variables définies dans le contrôleur back, sont disponibles au Javascript au travers d’un objet gon
:
console.log(gon.foo);
console.log(gon.bar);
Il est aussi possible de définir des variables globales, variables qui perdureront entre les pages. Par exemple dans un projet Rails, en définissant un nouvel initialiseur comme ceci :
# config/initializers/global_gon.rb
gon.global.foo = 'foo'
La variable foo
sera accessible dans le Javascript sur n’importe quelle page du projet, au travers de l’objet global
:
console.log(gon.global.foo)
Gon supporte aussi le rendu par Jbuilder ou Rabl. Il suffit de passer par Gon en lieu et place du render
habituel :
# app/controller/users_controller.rb
def index
@users = User.all
gon.jbuilder
end
# app/views/users/index.json.jbuilder
json.users @users, :id, :firstname, :lastname
// app/assets/javascripts/users.js
console.log(gon.users)
Enfin, en cas de besoin de mise à jour des données sans rechargement de page, Gon peut se charger d’aller les récupérer de manière cyclique avec sa fonction watch
. Pour ce faire, il suffit de définir les variables à observer lors de leur déclaration, puis d’utiliser la fonction watch
coté Javascript (en reprenant leur exemple):
# app/controller/home_controller.rb
def index
@users_count = User.count
gon.watch.users_count = @users_count
end
// app/assets/javascripts/home.js
var renewUsers = function(count) {
$('#users-counter').text(count);
};
gon.watch('users_count', interval: 1000, renewUsers);
Une requête ajax sera exécutée toutes les secondes pour renouveler la valeur de users_count
.
Ces gems ne sont pas indispensables, mais elle remplissent très bien leurs fonctions en nous simplifiant la tâche. Si vous voyez d’autres gems de ce type, n’hésitez pas à nous les partager.
L’équipe Synbioz.
Libres d’être ensemble.
Nos conseils et ressources pour vos développements produit.