Services, Was ich mir wünsche Ich habe als New Rails-Entwickler gelernt

Services bieten Rails App-Funktionalität in klaren, sauberen Kontrollmustern. Wir verwenden Services bei Redrooffs zur Strukturierung der Funktionen in den Apps, die wir mit einfachen Rubin-Objekten erstellen. Services fungieren als „Aktionsobjekte“ mit Methoden, die als benannte Aktionen ausgeführt werden. Denken Sie an Aktionen wie das Benachrichtigen eines Slack-Kanals, das Senden einer E-Mail oder das Abonnieren einer E-Mail-Liste. Services können auch zum Auslösen einer größeren, komplexeren Reihe von Aktionen in Ihrer App verwendet werden, z. B. eines Registrierungsprozesses oder eines Zahlungsflusses. Als neuer Entwickler wurde mir beigebracht, REST-konforme Routen zu erstellen und Methoden in den Stapel zu verschieben, was dazu führte, dass der Großteil meiner Anwendungslogik in der Modellebene lag. Wenn Sie sich mit dem Rails-Entwicklungsmuster vertraut machen, werden Sie feststellen, dass das Thema „Wo soll ich diesen Code platzieren?“ Konsistent ist. Lassen Sie mich diese Frage für Sie beantworten … machen Sie es zu einem Dienst.

Erste Schritte mit Diensten

Wie bereits erwähnt, handelt es sich bei Diensten um einfache Ruby-Objekte. Dies bedeutet, dass sie unabhängig vom Schienenzyklus sind. Sie müssen nicht dem Vererbungsmuster der Standardschienen folgen oder externe Bibliotheken verwenden, damit Dienste funktionieren (obwohl sie diese sicherlich häufig verwenden können). Services können so einfach sein wie das Senden einer E-Mail von einem Controller zu trennen oder so kompliziert wie ein Zahlungs-, Slack-Benachrichtigungs- und mobiles Benachrichtigungssystem. Rails ist wunderbar, weil es automatisch die neuen Ruby-Objekte erkennt, die im App-Ordner erstellt wurden. Dies bedeutet, dass keine Require Statements erforderlich sind, um Ihre Services in die Rails-Pipeline aufzunehmen. Um Ihre Services hinzuzufügen und zu organisieren, erstellen Sie einfach einen Services-Ordner im App-Verzeichnis Ihres Systems und starten Sie Ihren Rails-Server neu. Boom, sie sind bereit zu gehen.

  App / 
- Vermögenswerte
- Kanäle
- Steuerungen
- Helfer
- Arbeitsplätze
- Mailer
- Modelle
- Dienstleistungen
- Ansichten

Eigentlich mit einem Dienst

Okay, Ihr Service-Ordner ist einsatzbereit. Jetzt ist es Zeit, Ihre Dienste einzurichten und zu nutzen. In diesem Beispiel verwenden wir die Mailchimp-API, die vom Gibbon-Edelstein umschlossen wird, um eine Person zu einer Mailingliste hinzuzufügen. Hier ist unser Service, was wir tun werden, es erstellt das Service-Objekt, eine Methode zum Initiieren des API-Aufrufs und eine öffentliche Methode zum Initiieren des API-Aufrufs von unserem Controller.

  Benötige "Gibbon" 
  Klasse SubscriptionService 

def initialize (params)
@user_to_subscribe = params [: new_subscription]
Ende
  def durchführen 
Abonnieren
Ende
  Privatgelände 
  def subscribe_to_list 
gibbon.lists (ENV ["MAILCHIMP_USER_LIST"]). members.create (body: {email_address: @ user_to_subscribe.email, status: "Abonniert", merge_fields: {FNAME: @ user_to_subscribe.first_name, LNAME: @ user_to_subscribe} )
Ende
Ende

Wie Sie oben sehen können, haben wir ein einfaches Ruby-Objekt namens Subscription Service erstellt , das ein neues Abonnementobjekt annimmt. Eine Methode, die die neue Abonnentenmethode gibbon gem extrahiert und zuletzt eine Methode zum Starten der Abonnementanforderung bereitstellt. Jetzt ist es so einfach wie das Erstellen des neuen Serviceobjekts in einem Controller und das Aufrufen der Perform- Methode von Ihrem Controller. Im folgenden Beispiel werden neue Benutzer automatisch in unsere neue Benutzer-Mailingliste aufgenommen.

  Klasse UserController> ApplicationController 
  ... 
  def erstellen 
@user = User.create (user_params)

if @ user.save
...
SubscriptionService.new ({new_subscription: @user}). Perfom
...
sonst
...
Ende
...
Ende
  ... 
  Ende 

Sehen Sie, wie einfach das ist und wie sauber dieser Controller-Code jetzt aussieht?

Aufräumen und Zusammenfassung

Wir haben diesen Service mit einem schrecklichen Namensschema strukturiert. Um es zu bereinigen, geben wir dem Dienst einen MailChimp-spezifischen Namen, den wir MChimp nennen (hauptsächlich, weil ich mir ziemlich sicher bin, dass MailChimp ein reservierter Modulname aus dem Gibbon Gem ist). Dazu erstellen wir einen MChimp-Ordner im Ordner “Dienste”.

  App / 
- Vermögenswerte
- Kanäle
- Steuerungen
- Helfer
- Arbeitsplätze
- Mailer
- Modelle
- Dienstleistungen/
- MChimp
- Ansichten

Wir aktualisieren die SubscriptionService-Klasse auf:

  Benötige "Gibbon" 
  Modul MChimp 

Klasse SubscriptionService
...
# derselbe Code wie zuvor
...
Ende
  Ende 

Wir aktualisieren unseren Benutzer-Controller, um die Abonnementdienstklasse mit Namen zu verwenden.

  Klasse UserController> ApplicationController 
  ... 
  def erstellen 
@user = User.create (user_params)

if @ user.save
...
MChimp :: SubscriptionService.new ({new_subscription: @user}). Perfom
...
sonst
...
Ende
...
Ende
  ... 
  Ende 

Jetzt haben wir ein gut aufgeräumtes Modul, zu dem wir andere Serviceobjekte hinzufügen können, um vielleicht die Liste abzurufen und etwas damit zu tun. Serviceobjekte können immens mächtig sein und wenn Sie sich die Zeit genommen haben, ihren Entwicklungspartner kennenzulernen, werden Sie sich genauso verlieben wie ich.

Fröhliches Codieren.