Bien sûr, je serai ravi de te donner quelques exemples de bon et mauvais code dans une architecture de service Rails !
Commençons par un mauvais exemple. Imaginons que tu as un contrôleur UsersController
qui fait beaucoup trop de choses :
class UsersController < ApplicationController
def create
@user = User.new(user_params)
if @user.save
@user.send_welcome_email
redirect_to @user, notice: 'User was successfully created.'
else
render :new
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation)
end
end
Ici, le contrôleur est chargé de créer l'utilisateur et d'envoyer un e-mail de bienvenue, ce qui enfreint le principe de responsabilité unique.
Maintenant, voici comment nous pourrions améliorer ce code en déplaçant la logique d'envoi de l'e-mail de bienvenue dans un objet de service :
# app/services/user_registration_service.rb
class UserRegistrationService
def initialize(user)
@user = user
end
def call
if @user.save
send_welcome_email
end
end
private
def send_welcome_email
UserMailer.welcome_email(@user).deliver_now
end
end
Et le contrôleur serait alors :
class UsersController < ApplicationController
def create
@user = User.new(user_params)
service = UserRegistrationService.new(@user)
if service.call
redirect_to @user, notice: 'User was successfully created.'
else
render :new
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation)
end
end
Dans ce cas, le contrôleur ne s'occupe que de la gestion des requêtes HTTP et délègue la création de l'utilisateur et l'envoi de l'e-mail de bienvenue à UserRegistrationService
, ce qui est une bien meilleure pratique.
J'espère que cela te donne une meilleure idée de ce à quoi peut ressembler une bonne architecture de service Rails. N'hésite pas si tu as d'autres questions ! Et n'oublie pas de prendre le temps de faire une petite course à pied pour te rafraîchir l'esprit. 🏃♂️