Bien sûr, Thierry ! Allons-y avec quelques exemples. Mais d'abord, laisse-moi te rappeler qu'en JavaScript, tout peut être un objet... ou pas. C'est un peu comme le surf, parfois, tu te retrouves à surfer sur une vague parfaite, et parfois, tu te retrouves à boire la tasse. Mais assez parlé de moi, passons à ton problème.
Prenons l'exemple d'une application de commerce électronique, où un utilisateur peut passer une commande. Une mauvaise approche consisterait à mettre toute la logique de gestion des commandes dans le modèle Order ou dans le contrôleur OrdersController.
Mauvais exemple :
```ruby
class OrdersController < ApplicationController
def create
@order = Order.new(orderparams)
if @order.save
@order.update(stockitems)
UserMailer.with(user: @order.user).orderconfirmation.deliverlater
redirect_to @order
else
render :new
end
end
private
def orderparams
params.require(:order).permit(:productid, :user_id, :quantity)
end
def stockitems
StockItem.where(productid: orderparams[:productid]).reduce(order_params[:quantity])
end
end
```
Dans cet exemple, nous avons plusieurs responsabilités dans le contrôleur : la création de la commande, la mise à jour des stocks et l'envoi d'un e-mail de confirmation. C'est une mauvaise pratique car cela rend le contrôleur trop gros et difficile à gérer.
Bon exemple :
Une meilleure approche serait d'utiliser un objet de service pour gérer la logique de traitement des commandes.
class OrderService
def initialize(order)
@order = order
end
def process_order
if @order.save
update_stock_items
send_order_confirmation
true
else
false
end
end
private
def update_stock_items
StockItem.where(product_id: @order.product_id).reduce(@order.quantity)
end
def send_order_confirmation
UserMailer.with(user: @order.user).order_confirmation.deliver_later
end
end
Et dans le contrôleur, tu aurais quelque chose comme ceci :
class OrdersController < ApplicationController
def create
@order = Order.new(order_params)
if OrderService.new(@order).process_order
redirect_to @order
else
render :new
end
end
private
def order_params
params.require(:order).permit(:product_id, :user_id, :quantity)
end
end
Avec cette approche, chaque classe a une responsabilité unique et le code est beaucoup plus facile à comprendre et à maintenir. C'est un peu comme quand on a fini sa séance de surf et qu'on a nettoyé sa planche : tout est en ordre et prêt pour la prochaine vague.
J'espère que cela t'aide, Thierry ! Si tu as d'autres questions, n'hésite pas à me les poser.