Vezesse kontrollereit és modelljeit a Sébastien Carceles Dev on Rails Medium diétájára
Vagy az üzleti kód és a keretrendszer kódjának leválasztása az Interactors használatával.

A projekt növekszik. Apránként a kontrollerek és a modellek felelősek az üzleti műveletek végrehajtásáért. Piszkosak. Az üzleti kód keveredik a keretrendszer kódjával.
Ez a "zsírkontrollerek/zsírmodellek" nevű jelenség, és egyértelmű mutatója annak, hogy a projektet gyorsan nehéz fenntartani és méretezni.
Azt azonban tudjuk, hogy:
- az adatkezelőnek csak az ügyfélkéréseket kell feldolgoznia
- a modellnek csak az adatok tartósságáról kell gondoskodnia
Hasonló kód található sok projektben. A fenti példában a vezérlő létrehozási művelete felhalmozza a felelősségeket:
- példányosítson egy Vállalatot
- használjon harmadik féltől származó szolgáltatást
- gazdagítsa a Társaságot
- kezelni a hibákat a harmadik fél szolgáltatásának vagy az adatok érvényesítésének meghibásodása esetén
- értesítse a menedzsert e-mailben a siker esetén
- válasz a felhasználónak
Ezt a problémát, amelyet összefoglalhatunk a következővel: „Látom-e a problémát, de-hova kell akkor beírnom a kódomat?”, Számos tervezési minta foglalkozik. Amikor üzleti műveletekről beszélünk (és az üzleti műveletek általában többé-kevésbé összetett utasítások sorozatából állnak), valószínűleg a legegyszerűbb és leghatékonyabb minta az Interactor. Lehet, hogy már üzleti vagy szolgáltatási objektumként ismeri.
Ez a minta egy üzleti művelet elkülönítését javasolja egy tiszta Ruby osztályban, egyértelmű névvel (vagyis ami kifejezi a végrehajtott műveletet). Szerepe ennek az üzleti műveletnek a végrehajtása, és semmi más.
Itt hozhatunk létre például egy CreateCompany nevű interaktort, amelynek feladata tehát egy vállalat létrehozása. Ehhez végrehajtja a fent felsorolt lépéseket és kezeli a határeseteket.
Ez leegyszerűsíti a vezérlőt, amely ennek az osztálynak az ügyfelévé válik:
Phew, már jobban lélegzünk.
Hozhatnánk létre a CreateCompany osztályt a semmiből. Meg kell határoznunk egy közös keretrendszert minden interaktorunk számára, vagyis egy közös API-t, hogy a projekt összes interaktora ugyanúgy használjon és viselkedjen.