Eine einfache Ruby-Anwendung von Grund auf mit Active Record
Damian Watroba
Software Engineer
MVC ist ein Entwurfsmuster, das die Verantwortlichkeiten einer Anwendung aufteilt, um sie leichter handhabbar zu machen. Rails folgt diesem Entwurfsmuster per Konvention.
Ich arbeite gerne mit Schiene weil ich einfach und schnell eine Anwendung erstellen kann, die funktioniert, und sie der Welt oder nur meinen Freunden zeigen kann. Es gibt jedoch Arten von Anwendungen, die kein so großes Framework benötigen wie Schiene und alle seine Funktionalitäten.
Es kann vorkommen, dass unsere Anwendung nur M (Model) aus dem gesamten MVC-Muster benötigt Modell-Controller. Lohnt sich die Gründung einer Projekt in Schiene wenn wir wissen, dass der V-C-Teil (View-Controller) nicht benötigt wird?
Es ist gut zu wissen, dass Aktiver Datensatz Active Model, Action Pack und Action View, die für MVC verantwortlich sind, können unabhängig voneinander außerhalb von MVC verwendet werden. Schiene. Dies ermöglicht die Erstellung einer einfachen Ruby-Anwendung die über eine Datenbankverbindung verfügt, und entwickeln Sie sie ohne die unnötigen Code und Bibliotheken, die wir in einem Paket erhalten würden, wenn wir den Befehl rails new ausführen.
Ich habe Schritt für Schritt beschrieben, wie man dies erreicht und Sie können den gesamten Code auf GitHub finden. Der Link befindet sich am Ende dieses Artikels.
Struktur
Um unser Projekt zu starten, brauchen wir nicht viel. Beginnen wir mit der Erstellung einer Gemfile wo wir die Edelsteine hinzufügen, die wir für die Arbeit an der Anwendung benötigen, zusammen mit der Version von Rubinrot die wir verwenden werden.
cat Gemfile
# frozen_string_literal: wahr
Quelle 'https://rubygems.org'
ruby '2.7.2'
Eine fakultative README.md Datei soll beschreiben, wie unsere Anwendung funktioniert und wie wir weiter daran arbeiten können, sowohl für uns als auch für andere Entwickler, die das Projekt in Zukunft mit uns weiterentwickeln wollen.
cat README.md
# Anwendung
TUN: Löschen Sie diesen und den obigen Text, und beschreiben Sie Ihre Anwendung
app Verzeichnis mit anwendung.rb Datei, die für die Konfiguration und das Laden von Bibliotheken und Dateien zuständig ist, die wir unserer Anwendung hinzufügen werden. Denken Sie daran, die Datei Bündelinstallation zur Erzeugung der Gemfile.lock. Die Struktur unserer Anwendung sollte in diesem Stadium wie folgt aussehen:
Mit einer solchen Struktur können wir überlegen, welche Datenbank-Engine wir wählen und konfigurieren sollen. Für diesen Artikel habe ich PostgresQL gewählt, mit dem ich die meiste Erfahrung habe. Es kann auch MySQL oder SQlite3 sein, oder jede andere Engine, die mit Aktiver Datensatz. Bei der Wahl der Technologie sollte man sich von dem Zweck der Anwendung leiten lassen, wofür sie eingesetzt werden soll und welchen Zweck sie erfüllen soll.
Für eine schnelle und einfache Datenbankkonfiguration habe ich docker und docker-compose verwendet. Ich möchte nicht näher auf die Konfiguration dieser Tools und ihre Vor- und Nachteile eingehen, aber wenn Sie noch nie mit Docker gearbeitet haben, verweise ich Sie auf die offizielle Dokumentation für Docker und Docker Compose für weitere Informationen.
# app/application.rb
require 'pg'
Modul Anwendung
class Fehler < StandardFehler; end
# Ihr Code kommt hier hin...
end
Eigenständige Migrationen, Rake
Der nächste Schritt bei der Konfiguration unserer Anwendung ist das Hinzufügen der standalone_migrationen und Rechen gems, die es uns ermöglichen, unsere Migrationen wie in Rails zu verwalten und Zugang zu rake db: Befehlen zu erhalten.
Update Gemfile mit den erforderlichen Edelsteinen, und führen Sie eine Bündelinstallation
# gem verwendet in Nicht-Rail- und Nicht-Ruby-Anwendungen
gem 'standalone_migrations'
# standalone_migrations benötigt rake, um Migrationen zu erstellen und sie auszuführen, wie in Rails
gem 'rake'
# Gem benötigt, um Umgebungsvariablen zu laden
gem 'dotenv'
Fügen wir eine Rakefile zu unserem Projekt im Stammverzeichnis, in das wir Folgendes laden werden dotenv und standalone_migrationen die wir zuvor hinzugefügt haben
Mit dem Rakefile so konfiguriert, können wir prüfen, ob unsere Rechen funktioniert durch die Verwendung des Rake-T der eine Liste der in unserer Anwendung verfügbaren Befehle zurückgeben sollte.
Vor rake db:createWir benötigen jedoch noch eine Konfigurationsdatei in unserem Projekt, um eine Verbindung zur Postgres-Instanz herzustellen. Um dies zu tun, müssen wir ein db-Verzeichnis zusammen mit einer config.yml Datei, die wie die folgende aussehen sollte:
Wie Sie sehen können, habe ich Umgebungsvariablen verwendet, um die Verbindung zu unserem Postgres zu konfigurieren, wo wir sensible Daten aufbewahren werden, die nicht im Repository sein sollten. Hierfür habe ich die zuvor hinzugefügte gem dotenvdie ebenfalls in die Rakefile zusammen mit standalone_migrationen. Wenn wir Git verwenden, um die Versionskontrolle unserer Anwendung zu verwalten, denken wir daran, eine .gitignore Datei, in der wir die Möglichkeit der Nachverfolgung der .env Datei aus unserem Projekt.
# .gitignore
.env*
!.env.example
und fügen Sie eine.env Datei, die die korrekt konfigurierte ENV
In diesem Stadium sollten wir in der Lage sein, die rake db:create Befehl, mit dem die Datenbank erstellt wird
Versuchen wir nun, eine neue Migration über rake db:new_migration name=, wo wir eine Beiträge Tisch mit einer :Titel Spalte
# frozen_string_literal: true
Klasse CreatePosts < ActiveRecord::Migration[6.0]
def change
create_table :posts do |t|
t.string :titel
end
end
end
Sie sollten feststellen, dass die db/migrate Verzeichnis wurde automatisch hinzugefügt und schema.rb wurde nach erfolgreicher Migration erstellt. Derzeit sieht unsere Projektstruktur wie folgt aus:
Der letzte, aber nicht unwichtigste Schritt bei der Erstellung unserer Anwendung ist das Hinzufügen von activerecord und seine Konfiguration. Hierfür müssen wir unser Gemfile mit 3 weiteren Gems aktualisieren:
gem 'activerecord'
gem 'erb'
gem 'yaml'
Warum wir hinzufügen erb und ymal wird unten in den Kommentaren erläutert. Die gesamte aktiver_datensatz Konfiguration wird in der app/application.rb Datei.
Gehen wir der Reihe nach durch, was hier passiert:
# frozen_string_literal: true
# Wenn wir die Anwendung in verschiedenen Umgebungen laufen lassen wollen,
# z.B. Test oder Produktion, ist es gut, den ENVIRONMENT-Wert
# am Anfang zu setzen, der aus der Umgebungsvariablen
# oder standardmäßig `Entwicklung`.
ENV['ENVIRONMENT'] ||= 'Entwicklung'
# Um die hinzugefügten Edelsteine zu verwenden, müssen wir sie mit der Methode Kernel#require laden,
#, die die als Parameter übergebene Datei oder Bibliothek lädt
require 'pg'
erfordern 'active_record'
erfordern 'dotenv'
erfordern 'yaml'
erfordern 'erb'
# Standardmäßig reicht Dotenv.load zum Laden von Umgebungsvariablen aus
# auf die Datei `.env`, wenn wir also andere Umgebungen verwenden wollen, lohnt es sich
# lohnt es sich, diese Methode auf die folgende zu erweitern, die zuerst für eine bestimmte Entwicklungs
# Umgebung nach einer Datei sucht, die auf `.env.development.local` endet,
# dann `.env.development` und schließlich `.env`.
Dotenv.load(".env.#{ENV.fetch('ENVIRONMENT')}.local", ".env.#{ENV.fetch('ENVIRONMENT')}", '.env')
# Erforderliche Methode zum Laden der Datenbankeinstellungen
def db_configuration
# Die folgende Methode gibt den Pfad zu der Datei mit unserer Konfiguration zurück
db_configuration_file_path = File.join(File.expand_path('..', __dir__), 'db', 'config.yml')
# Nachdem wir den Pfad zur Datei kennen, können wir ihre Werte lesen. Da die Datei config.yml
# Datei Umgebungsvariablen enthält und, wie Sie vielleicht bemerkt haben,
# die erb -Syntax enthält, müssen wir auch das erb gem verwenden. Ohne dieses,
# werden die Werte der Variablen nicht korrekt gelesen und activerecord
# kann sich nicht mit Postgres verbinden Die folgende Methode gibt
# die Konfiguration als String
db_configuration_result = ERB.new(File.read(db_configuration_file_path)).result
# Mit Hilfe des zuvor hinzugefügten `yaml`-Gems können wir unsere Konfiguration sicher laden
YAML.safe_load(db_configuration_result, aliases: true)
end
# Schließlich müssen wir eine Verbindung zwischen activerecord und postgres herstellen
# mit Hilfe der Methode `establish_connection`
ActiveRecord::Base.establish_connection(db_configuration[ENV['ENVIRONMENT']])
module Anwendung
class Error < StandardError; end
# Ihr Code kommt hier hin...
end
Da wir bereits über die Konfigurationen verfügen, können wir das Post-Modell in unserem Rubinrot app.
├── app
│└── Modelle
│└── post.rb
app/models/post.rb
# frozen_string_literal: true
Klasse Post < ActiveRecord::Base;end
und denken Sie daran, die Datei in anwendung.rb
erfordern 'app/models/post'
Denken Sie auch daran, require hinzuzufügen app/runner zu app/application.rb
Wenn wir unserer Anwendung neue Dateien, Dienste oder weitere Modelle hinzufügen wollen, müssen wir sie in anwendung.rb.
ZUSAMMENFASSUNG
Derzeit ist unsere Ruby-Anwendung bereit, weiterzumachen. Wir haben konfiguriert:
Datenbankverbindung,
Aktiver Rekord,
Eigenständige Migrationen mit Rake
Wie Sie sehen können, ist es nicht immer notwendig, die Schienen neu. Auf diese Weise vermeiden wir unnötigen Code in unserer Anwendung, der nicht verwendet wird. Wir haben mehr Kontrolle über die Entwicklung unserer Anwendung. Wir können mit der Zeit weitere Bibliotheken und Geschäftslogik hinzufügen. Wir können eine so konfigurierte Anwendung verwenden, um einen Crawler oder Scraper zu erstellen, eine Verbindung zu einer externen API herzustellen, von der wir Informationen abrufen und in unserer eigenen Datenbank speichern, oder Dateien zu laden und interessante Informationen daraus zu extrahieren. Ich wünsche Ihnen viel Erfolg bei der weiteren Entwicklung Ihrer eigenen Anwendungen!
BONUS
Unsere Anwendung muss auch irgendwie gestartet werden. Wir können dies auf verschiedene Arten tun, zum Beispiel über das Terminal. Wir können ein exe/app Datei, die unsere Anwendungslogik aus der app/application Datei und führen unsere Anwendung über die Läufer Dienst im App-Verzeichnis hinzugefügt.