Techniques Rails avancées : Allez au-delà des bases
Vous maîtrisez les bases de Rails ? Il est temps de passer au niveau supérieur ! Découvrons ensemble des techniques avancées qui rendront votre code plus expressif, maintenable et... "railsy". Dans cet article, nous explorerons comment utiliser les class methods, organiser votre code avec les concerns, créer vos propres générateurs et même étendre Rails avec des fonctionnalités personnalisées.
Alors qu'est-ce qu'on attend ? C'est partie :)
L'article a été écrit suite à la présentation de Chris Oliver à Rails World 2025, retrouvez la vidéo d'origine à la fin.
Qu'est-ce qui rend le code "railsy" ?
Rails a cette capacité unique de rendre le code lisible comme si vous lisiez un livre. Pensez aux méthodes comme `has_many :subscribers` ou `has_one_attached :featured_image`. C'est magique, non ? Cette expressivité vient de Ruby et de la philosophie Rails qui veut que votre code soit sur un pied d'égalité avec celui du framework lui-même.
Dans les contrôleurs, on retrouve cette même élégance avec `before_action :authenticate_user`. Rails 8 pousse ce concept encore plus loin avec des méthodes comme :
Ces méthodes se distinguent visuellement des `before_action` classiques, et c'est volontaire !
Créer ses propres class methods Rails
Au-delà des before_action traditionnels
Vous pourriez écrire ceci dans vos contrôleurs :
Mais pourquoi ne pas faire comme Rails et créer une class method plus expressive ?
C'est quand même plus clair, non ?
(Et en plus, ça fait moins mal aux yeux que de chercher le bon `before_action` dans une liste de dix !)
Implémenter des class methods personnalisées
Voici comment créer cette magie dans un concern d'autorisation :
L'avantage des class methods ? Vous pouvez passer des arguments ! Fini de créer dix méthodes différentes pour dix cas d'usage.
Organiser son code avec les dossiers personnalisés
Sortir des sentiers battus
Rails ne vous oblige pas à tout fourrer dans `models`, `views` et `controllers`. Vous pouvez créer vos propres dossiers dans `app/` :
- `app/api_clients/` pour vos clients d'API
- `app/ui_components/` pour vos composants d'interface
- `app/validators/` pour vos validations personnalisées
- `app/notifiers/` pour vos notifications
- `app/services/` pour vos services
Rails chargera automatiquement ces dossiers. C'est comme avoir un tiroir pour chaque type d'ustensile dans sa cuisine ! Cela rendra votre code tellement plus agréable à lire et à maintenir.
Exemple concret : clients d'API personnalisés
Au lieu d'utiliser une gem externe qui implémente 200 endpoints dont vous n'avez besoin que d'un seul, créez votre propre client :
Plus simple, plus maintenable, et zéro dépendance externe !
Générateurs Rails personnalisés
Créer ses propres outils
Rails vous permet de créer vos propres générateurs. C'est parfait pour standardiser les patterns de votre équipe :
Cela crée un générateur qui hérite de `NamedBase`, gérant automatiquement les arguments et les chemins de fichiers :
Personnaliser les templates existants
Vous utilisez encore les scaffolds pour vous simplifier la vie. Mais vous avez marre des `<%= notice %>` alors que vous l'avez déjà dans votre layout ?
Bah facile Monique. Surchargez le template :
Maintenant vos scaffolds s'adaptent à votre application !
Concerns pour l'organisation, pas seulement la réutilisation
Organiser par fonctionnalité
Les concerns ne servent pas qu'à partager du code. Vous pouvez, et certains diraient même devez, les utiliser pour organiser les modèles par fonctionnalité :
Ces modules vivent dans `app/models/user/` et contiennent toute la logique relative à chaque fonctionnalité. Fini les modèles de 500 lignes où tout se mélange !
Exemple complet : intégration Cloudflare Turnstile
Qu'est-ce que Cloudfare Turnstile
Cloudflare Turnstile est une alternative moderne aux CAPTCHA traditionnels (tu sais, ces tests agaçants où il faut identifier des feux de circulation ou des passages piétons 😅).
Le problème qu'il résout :
- Les bots : Des programmes automatisés peuvent spammer tes formulaires, créer de faux comptes, etc.
- Les CAPTCHA classiques : Frustrants pour les utilisateurs, parfois difficiles à résoudre, pas toujours accessibles
Turnstile vérifie que l'utilisateur est humain de manière invisible ou presque. Il analyse le comportement du navigateur en arrière-plan, sans embêter l'utilisateur avec des puzzles. C'est gratuit et plus respectueux de la vie privée que reCAPTCHA.
Le problème initial
Vous voulez intégrer Turnstile dans votre formulaire d'inscription. Premier réflexe :
Pourquoi c'est frustrant ?
Imagine ce scénario :
- Un utilisateur remplit ton formulaire d'inscription
- Il oublie de remplir son email (erreur de validation)
- Il soumet le formulaire
- Turnstile passe (il est humain), mais l'email manque
- Le formulaire se recharge avec l'erreur "Email requis"
- Il ajoute son email et re-soumet
- Nouveau challenge Turnstile ! 😤
Le token Turnstile n'est valable qu'une seule fois. Chaque soumission = nouveau challenge.
La solution élégante
Créons un concern réutilisable :
- attr_accessor :challenge_token : Crée un attribut temporaire (pas dans la base de données) pour stocker le token Turnstile
- validates :challenge_token, turnstile: true : Ajoute une validation qui vérifie le token avec Cloudflare
Pourquoi un concern ? Tu peux facilement l'ajouter à n'importe quel modèle (User, Comment, ContactForm, etc.)
Maintenant créons un validateur personnalisé
Ce qui se passe :
- Rails appelle automatiquement ce validateur quand tu fais @user.save
- Il vérifie le token avec l'API Cloudflare
- Si ça échoue, il ajoute une erreur comme n'importe quelle autre validation
Maintenant dans votre modèle :
Une seule ligne, et ton User a maintenant la protection Turnstile.
Et votre contrôleur redevient simple :
Étendre Rails avec des template handlers
Le principe
Rails utilise un système de template handlers pour traiter différents formats. `index.html.erb` ? Le handler ERB traite le fichier. `index.json.jbuilder` ? C'est le handler JBuilder qui s'en occupe.
Vous pouvez créer vos propres handlers ! (Bon, l'exemple PHP dans la présentation était... disons... "original", mais le principe reste valable.)
Exemple pratique : Farem PDF
Voici un exemple plus sérieux avec la gem Farem PDF qui génère des PDFs sans Node.js :
Le renderer personnalisé :
- Capture le HTML rendu
- Lance Chrome en mode headless
- Génère le PDF
- Le retourne au navigateur
Tout ça de manière transparente !
Conclusion
Ces techniques avancées transforment Rails d'un framework web en un véritable langage métier. En utilisant les class methods, l'organisation par concerns, les générateurs personnalisés et les extensions de Rails, vous créez un code qui raconte une histoire et se lit comme un livre.
Le secret ? Ne pas avoir peur d'étendre Rails selon vos besoins. Le framework est conçu pour être personnalisé, alors profitez-en ! Et n'oubliez pas : si votre code ne se lit pas comme de l'anglais, c'est qu'il y a probablement une façon plus "railsy" de l'écrire.
La présentation d'origine par Chris Oliver :
Rails Ascent