Wie man ein Ruby on Rails-Anwendung erstellen kann

Einführung

Rails ist ein Webanwendungsframework, das in Ruby geschrieben ist. Es verfolgt einen eingenommenen Ansatz bei der Anwendungsentwicklung und geht davon aus, dass festgelegte Konventionen den Entwicklern dort am besten dienen, wo ein gemeinsames Ziel besteht. Rails bietet daher Konventionen für die Behandlung von Routing, zustandsbehafteten Daten, Asset-Management und mehr, um die grundlegende Funktionalität bereitzustellen, die die meisten Webanwendungen benötigen.

Rails folgt dem Model-View-Controller (MVC) Architekturmuster, das die Logik der Anwendung, die sich in Modellen befindet, vom Routing und der Darstellung der Anwendungsinformationen trennt. Diese organisatorische Struktur — zusammen mit anderen Konventionen, die es Entwicklern ermöglichen, Code in Helfer und Teilansichten zu extrahieren — stellt sicher, dass der Anwendungscode nicht unnötig wiederholt wird.

In diesem Tutorial erstellen Sie eine Rails-Anwendung, die es Benutzern ermöglicht, Informationen über Haie und ihr Verhalten zu posten. Dies wird ein guter Ausgangspunkt für die zukünftige Anwendungsentwicklung sein.

Voraussetzungen

Um diesem Tutorial zu folgen, benötigen Sie:

  • Eine lokale Maschine oder einen Entwicklungsserver, auf dem Ubuntu 18.04 läuft. Ihre Entwicklungs-Maschine sollte einen Benutzer ohne Root-Rechte mit administrativen Berechtigungen und eine mit ufw konfigurierte Firewall haben. Anweisungen zur Einrichtung finden Sie in unserem Tutorial Ersteinrichtung eines Servers mit Ubuntu 18.04.
  • Node.js und npm müssen auf Ihrer lokalen Maschine oder Ihrem Entwicklungsserver installiert sein. Dieses Tutorial verwendet Node.js Version 10.16.3 und npm Version 6.9.0. Anleitungen zur Installation von Node.js und npm auf Ubuntu 18.04 finden Sie im Abschnitt „Installation mit einem PPA“ von Wie man Node.js auf Ubuntu 18.04 installiert.
  • Ruby, rbenv, und Rails auf Ihrer lokalen Maschine oder Entwicklungsserver installiert, indem Sie die Schritte 1-4 in How To Install Ruby on Rails with rbenv on Ubuntu 18.04 befolgen. Dieses Tutorial verwendet Ruby 2.5.1, rbenv 1.1.2 und Rails 5.2.0.

Schritt 1 — Installieren von SQLite3

Bevor wir unsere Rails-Shark-Anwendung erstellen, müssen wir sicherstellen, dass wir eine Datenbank haben, um Benutzerdaten zu speichern. Rails ist standardmäßig für die Verwendung von SQLite konfiguriert, und das ist oft eine gute Wahl in der Entwicklung. Da unsere Anwendungsdaten keine hohe programmatische Erweiterbarkeit erfordern, wird SQLite unseren Bedürfnissen entsprechen.

Aktualisieren Sie zunächst Ihr Paket-Index:

  1. sudo apt update

Installieren Sie anschließend die Pakete sqlite3 und libsqlite3-dev:

sudo apt install sqlite3 libsqlite3-dev

Dadurch werden sowohl SQLite als auch die erforderlichen Entwicklungsdateien installiert.

Überprüfen Sie Ihre Version, um zu bestätigen, dass die Installation erfolgreich war:

  1. sqlite3 --version
Output
3.22.0 2018-01-22 18:45:57 0c55d179733b46d8d0ba4d88e01a25e10677046ee3da1d5b1581e86726f2alt1

Mit installiertem SQLite können Sie beginnen, Ihre Anwendung zu entwickeln.

Schritt 2 — Erstellen eines neuen Rails-Projekts

Mit unserer installierten Datenbank können wir ein neues Rails-Projekt erstellen und uns einige der Standard-Boilerplate-Code ansehen, die Rails uns mit dem rails new-Befehl bietet.

Erstellen Sie ein Projekt namens sharkapp mit dem folgenden Befehl:

  1. rails new sharkapp

Sie werden eine Menge Ausgaben sehen, die Ihnen mitteilen, was Rails für Ihr neues Projekt erstellt. Die unten hervorgehobene Ausgabe zeigt einige bedeutende Dateien, Verzeichnisse und Befehle:

Output
create . . . create Gemfile . . . create app . . . create app/controllers/application_controller.rb . . . create app/models/application_record.rb . . . create app/views/layouts/application.html.erb . . . create config create config/routes.rb create config/application.rb . . . create config/environments create config/environments/development.rb create config/environments/production.rb create config/environments/test.rb . . . create config/database.yml create db create db/seeds.rb . . . run bundle install . . . Bundle complete! 18 Gemfile dependencies, 78 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. . . . * bin/rake: Spring inserted * bin/rails: Spring inserted

Die hier hervorgehobene Ausgabe zeigt Ihnen, dass Rails Folgendes erstellt hat:

  • Gemfile: Diese Datei listet die Gem-Abhängigkeiten für Ihre Anwendung auf. Ein Gem ist ein Ruby-Softwarepaket, und ein Gemfile ermöglicht es Ihnen, die Softwareanforderungen Ihres Projekts zu verwalten.
  • app: Das app-Verzeichnis ist der Ort, an dem sich der Hauptcode Ihrer Anwendung befindet. Dies umfasst die Modelle, Controller, Ansichten, Assets, Helfer und Mailer, die die Anwendung selbst ausmachen. Rails bietet Ihnen einige anwendungsspezifische Boilerplate-Code für das MCV-Modell, um in Dateien wie app/models/application_record.rb, app/controllers/application_controller.rb und app/views/layouts/application.html.erb zu beginnen.
  • config: Dieses Verzeichnis enthält die Konfigurationseinstellungen Ihrer Anwendung:
    • config/routes.rb: Die Routendeklarationen Ihrer Anwendung befinden sich in dieser Datei.
    • config/application.rb: Allgemeine Einstellungen für die Komponenten Ihrer Anwendung sind in dieser Datei enthalten.
  • config/environments: In diesem Verzeichnis befinden sich die Konfigurationseinstellungen für Ihre Umgebungen. Rails bietet standardmäßig drei Umgebungen: development, production und test.
  • config/database.yml: Die Datenbankkonfigurationseinstellungen befinden sich in dieser Datei, die in vier Abschnitte unterteilt ist: default, development, production und test. Dank der Gemfile, die mit dem rails new Befehl geliefert wurde und die sqlite3 Gem enthielt, ist der adapter Parameter in unserer config/database.yml Datei bereits auf sqlite3 gesetzt, was bedeutet, dass wir eine SQLite-Datenbank mit dieser Anwendung verwenden werden.
  • db: Dieser Ordner enthält ein Verzeichnis für Datenbankmigrationen namens migrate, sowie die Dateien schema.rb und seeds.rb. schema.db enthält Informationen über Ihre Datenbank, während seeds.rb der Ort ist, an dem Sie Startdaten für die Datenbank platzieren können.

Schließlich führt Rails den bundle install Befehl aus, um die in Ihrer Gemfile aufgelisteten Abhängigkeiten zu installieren.

Sobald alles eingerichtet ist, navigieren Sie zum Verzeichnis sharkapp:

  1. cd sharkapp

Sie können jetzt den Rails-Server starten, um sicherzustellen, dass Ihre Anwendung funktioniert, indem Sie den rails server Befehl verwenden. Wenn Sie auf Ihrem lokalen Rechner arbeiten, geben Sie ein:

  1. rails server

Rails bindet standardmäßig an localhost, sodass Sie Ihre Anwendung jetzt durch Navigieren in Ihrem Browser zu locahost:3000 aufrufen können, wo Sie das folgende Bild sehen werden:

Wenn Sie auf einem Entwicklungsserver arbeiten, stellen Sie zunächst sicher, dass Verbindungen an Port 3000 erlaubt sind:

  1. sudo ufw allow 3000

Starten Sie dann den Server mit dem --binding Flag, um an Ihre Server-IP zu binden:

  1. rails server --binding=your_server_ip

Navigieren Sie in Ihrem Browser zu http://your_server_ip:3000, wo Sie die Rails-Begrüßungsnachricht sehen werden.

Sobald Sie sich umgesehen haben, können Sie den Server mit STRG+C anhalten.

Mit Ihrer Anwendung erstellt und an Ort und Stelle können Sie beginnen, aus dem Rails-Boilerplate heraus eine einzigartige Anwendung zu erstellen.

Schritt 3 — Die Anwendung aufbauen

Um unsere Haifisch-Informationsanwendung zu erstellen, benötigen wir ein Modell zur Verwaltung unserer Anwendungsdaten, Ansichten zur Ermöglichung der Benutzerinteraktion mit diesen Daten und einen Controller zur Verwaltung der Kommunikation zwischen Modell und Ansichten. Um diese Dinge zu erstellen, verwenden wir den Befehl rails generate scaffold, der uns ein Modell, eine Datenbankmigration zur Änderung des Datenbankschemas, einen Controller, einen vollständigen Satz von Ansichten zur Verwaltung von Erstellen, Lesen, Aktualisieren und Löschen (CRUD) für die Anwendung und Vorlagen für Teilansichten, Helfer und Tests bietet.

Da der Befehl generate scaffold so viel Arbeit für uns erledigt, werfen wir einen genaueren Blick auf die von ihm erstellten Ressourcen, um die Arbeit zu verstehen, die Rails im Hintergrund leistet.

Unser Befehl `generate scaffold` wird den Namen unseres Modells und die Felder enthalten, die wir in unserer Datenbanktabelle haben möchten. Rails verwendet `Active Record`, um Beziehungen zwischen Anwendungsdaten, die als Objekte mit Modellen konstruiert sind, und der Anwendungsdatenbank zu verwalten. Jedes unserer Modelle ist eine `Ruby-Klasse`, erbt aber auch von der Klasse `ActiveRecord::Base`. Das bedeutet, dass wir mit unserer Modellklasse genauso arbeiten können, wie wir es mit einer Ruby-Klasse tun würden, während wir gleichzeitig Methoden von Active Record verwenden können. Active Record stellt dann sicher, dass jede Klasse einer Tabelle in unserer Datenbank zugeordnet ist und jede Instanz dieser Klasse einer Zeile in dieser Tabelle.

Geben Sie den folgenden Befehl ein, um ein `Shark`-Modell, einen Controller und zugehörige Ansichten zu generieren:

  1. rails generate scaffold Shark name:string facts:text

Mit `name:string` und `facts:text` geben wir Rails Informationen über die Felder, die wir in unserer Datenbanktabelle haben möchten, und den Typ der Daten, die sie akzeptieren sollen. Beide ermöglichen uns, Eingaben zu tätigen, obwohl `text` mehr Zeichen für Haifakten zulässt.

Wenn Sie diesen Befehl eingeben, sehen Sie wieder eine lange Liste von Ausgaben, die Ihnen erklären, was Rails alles für Sie generiert. Die unten stehende Ausgabe hebt einige der wichtigeren Aspekte für unsere Einrichtung hervor:

Output
invoke active_record create db/migrate/20190804181822_create_sharks.rb create app/models/shark.rb . . . invoke resource_route route resources :sharks invoke scaffold_controller create app/controllers/sharks_controller.rb invoke erb create app/views/sharks create app/views/sharks/index.html.erb create app/views/sharks/edit.html.erb create app/views/sharks/show.html.erb create app/views/sharks/new.html.erb create app/views/sharks/_form.html.erb . . .

Rails hat das Modell unter app/models/shark.rb erstellt und eine Datenbankmigration dafür erstellt: db/migrate/20190804181822_create_sharks.rb. Der Zeitstempel in Ihrer Migrationsdatei wird sich von dem hier gezeigten unterscheiden.

Es hat auch einen Controller, app/controllers/sharks_controller.rb, sowie die Ansichten erstellt, die mit den CRUD-Operationen unserer Anwendung verbunden sind und unter app/views/sharks gesammelt sind. Unter diesen Ansichten befindet sich eine Partial-Datei, _form.html.erb, die Code enthält, der in verschiedenen Ansichten verwendet wird.

Schließlich hat Rails eine neue ressourcenorientierte Route, resources :sharks, zu config/routes.rb hinzugefügt. Dies ermöglicht es dem Rails-Router, eingehende HTTP-Anfragen mit dem sharks-Controller und den zugehörigen Ansichten abzugleichen.

Obwohl Rails viel Arbeit bei der Erstellung unseres Anwendungscodes für uns erledigt hat, lohnt es sich, einige Dateien genauer zu betrachten, um zu verstehen, was passiert.

Schauen wir uns zunächst die Controller-Datei mit dem folgenden Befehl an:

  1. cat app/controllers/sharks_controller.rb
Output
class SharksController < ApplicationController before_action :set_shark, only: [:show, :edit, :update, :destroy] # GET /sharks # GET /sharks.json def index @sharks = Shark.all end # GET /sharks/1 # GET /sharks/1.json def show end # GET /sharks/new def new @shark = Shark.new end # GET /sharks/1/edit def edit end # POST /sharks # POST /sharks.json def create @shark = Shark.new(shark_params) respond_to do |format| if @shark.save format.html { redirect_to @shark, notice: 'Shark was successfully created.' } format.json { render :show, status: :created, location: @shark } else format.html { render :new } format.json { render json: @shark.errors, status: :unprocessable_entity } end end end # PATCH/PUT /sharks/1 # PATCH/PUT /sharks/1.json def update respond_to do |format| if @shark.update(shark_params) format.html { redirect_to @shark, notice: 'Shark was successfully updated.' } format.json { render :show, status: :ok, location: @shark } else format.html { render :edit } format.json { render json: @shark.errors, status: :unprocessable_entity } end end end # DELETE /sharks/1 # DELETE /sharks/1.json def destroy @shark.destroy respond_to do |format| format.html { redirect_to sharks_url, notice: 'Shark was successfully destroyed.' } format.json { head :no_content } end end private # Verwenden Sie Callbacks, um allgemeine Setups oder Bedingungen zwischen Aktionen zu teilen. def set_shark @shark = Shark.find(params[:id]) end # Vertrauen Sie niemals Parametern aus dem gefährlichen Internet, lassen Sie nur die Whitelist durch. def shark_params params.require(:shark).permit(:name, :facts) end end

Der Controller ist verantwortlich dafür, wie Informationen abgerufen und an das zugehörige Modell übergeben werden, und wie sie mit bestimmten Ansichten verknüpft werden. Wie Sie sehen können, enthält unser sharks-Controller eine Reihe von Methoden, die ungefähr den standardmäßigen CRUD-Operationen entsprechen. Es gibt jedoch mehr Methoden als CRUD-Funktionen, um Effizienz im Falle von Fehlern zu gewährleisten.

Betrachten Sie zum Beispiel die create-Methode:

~/sharkapp/app/controllers/sharks_controller.rb
. . .
  def create
    @shark = Shark.new(shark_params)

    respond_to do |format|
      if @shark.save
        format.html { redirect_to @shark, notice: 'Shark was successfully created.' }
        format.json { render :show, status: :created, location: @shark }
      else
        format.html { render :new }
        format.json { render json: @shark.errors, status: :unprocessable_entity }
      end
    end
  end
. . . 

Wenn eine neue Instanz der Shark-Klasse erfolgreich gespeichert wird, wird redirect_to eine neue Anfrage erzeugen, die dann an den Controller weitergeleitet wird. Dies wird eine GET-Anfrage sein und von der show-Methode behandelt werden, die dem Benutzer den gerade hinzugefügten Hai zeigt.

Wenn ein Fehler auftritt, wird Rails die app/views/sharks/new.html.erb-Vorlage erneut rendern, anstatt eine weitere Anfrage an den Router zu stellen, und den Benutzern so eine weitere Möglichkeit zu geben, ihre Daten einzureichen.

Neben dem Sharks-Controller hat uns Rails einen Vorlauf für eine index Ansicht gegeben, die auf die index Methode unseres Controllers mapst. Wir werden diese Ansicht als Startseite unserer Anwendung verwenden, daher ist es wert, sie ein bisschen zu schauen.

Tippen Sie folgendes, um das Datei auszugeben:

  1. cat app/views/sharks/index.html.erb
Output
<p id="notice"><%= notice %></p> <h1>Sharks</h1> <table> <thead> <tr> <th>Name</th> <th>Facts</th> <th colspan="3"></th> </tr> </thead> <tbody> <% @sharks.each do |shark| %> <tr> <td><%= shark.name %></td> <td><%= shark.facts %></td> <td><%= link_to 'Show', shark %></td> <td><%= link_to 'Edit', edit_shark_path(shark) %></td> <td><%= link_to 'Destroy', shark, method: :delete, data: { confirm: 'Are you sure?' } %></td> </tr> <% end %> </tbody> </table> <br> <%= link_to 'New Shark', new_shark_path %>

Die index Ansicht durchiteriert die Instanzen unserer Shark Klasse, die zugeordnet sind zum sharks Tabellen in unserem Datenbank. Mit Hilfe des ERB-Templatings wird jeder Feld vom Tabelle ausgegeben, der mit einer einzelnen Scharkinstanz verbunden ist: name und facts.

Die View benutzt dann den link_to Helper, um einen Hyperlink zu erstellen, mit dem angegebenen String als Text für den Link und dem angegebenen Pfad als Ziel. Die Pfade selbst sind möglich, weil sie durch die Hilfern erstellt wurden, die uns zur Verfügung standen, als wir die sharks Ressourcenroute mit dem Befehl rails generate scaffold definiert haben.

Ausserdem können wir auch die new Ansicht ansehen, um zu sehen wie Rails Partialansichten in Views verwendet. Tippen Sie folgendes, um das app/views/sharks/new.html.erb Template auszugeben:

  1. cat app/views/sharks/new.html.erb
Output
<h1>New Shark</h1> <%= render 'form', shark: @shark %> <%= link_to 'Back', sharks_path %>

Obwohl diese Vorlage möglicherweise so aussieht, als ob sie keine Eingabefelder für einen neuen Hai-Eintrag enthält, verrät uns der Verweis auf render 'form', dass die Vorlage das Teil _form.html.erb einbindet, das Code extrahiert, der in verschiedenen Ansichten wiederholt wird.

Wenn wir uns diese Datei ansehen, bekommen wir ein vollständiges Verständnis davon, wie eine neue Hai-Instanz erstellt wird:

  1. cat app/views/sharks/_form.html.erb
Output
<%= form_with(model: shark, local: true) do |form| %> <% if shark.errors.any? %> <div id="error_explanation"> <h2><%= pluralize(shark.errors.count, "error") %> prohibited this shark from being saved:</h2> <ul> <% shark.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </div> <% end %> <div class="field"> <%= form.label :name %> <%= form.text_field :name %> </div> <div class="field"> <%= form.label :facts %> <%= form.text_area :facts %> </div> <div class="actions"> <%= form.submit %> </div> <% end %>

Diese Vorlage nutzt den form_with Formularhelfer. Formularhelfer sind dazu da, die Erstellung neuer Objekte aus Benutzereingaben unter Verwendung der Felder und des Umfangs bestimmter Modelle zu erleichtern. Hier nimmt form_with model: shark als Argument, und der neue Formularbauer-Objekt, den es erstellt, hat Eingabefelder, die den Feldern in der sharks-Tabelle entsprechen. Somit haben Benutzer Formularfelder, um sowohl einen Hai-name als auch Hai-fakten einzugeben.

Wenn dieses Formular abgesendet wird, wird eine JSON-Antwort mit Benutzerdaten erstellt, auf die der Rest Ihrer Anwendung über die params-Methode zugreifen kann, die ein ActionController::Parameters-Objekt mit diesen Daten erstellt.

Nachdem Sie nun wissen, was rails generate scaffold für Sie erzeugt hat, können Sie fortfahren, um die Hauptansicht für Ihre Anwendung festzulegen.

Schritt 4 — Erstellen der Anwendungs-Root-Ansicht und Testen der Funktionalität

Idealerweise sollte die Startseite Ihrer Anwendung auf den Stamm der Anwendung zeigen, damit Benutzer sofort ein Gefühl für den Zweck der Anwendung bekommen.

Es gibt mehrere Möglichkeiten, dies zu handhaben: Sie könnten beispielsweise einen Welcome-Controller und eine zugehörige index-Ansicht erstellen, die Benutzern eine allgemeine Startseite bietet, die auch zu verschiedenen Teilen der Anwendung verlinken könnte. In unserem Fall reicht es jedoch aus, wenn die Benutzer auf unsere index-Haifisch-Ansicht gelangen, um den Zweck der Anwendung für den Moment zu verdeutlichen.

Um dies einzurichten, müssen Sie die Routing-Einstellungen in config/routes.rb anpassen, um den Stamm der Anwendung festzulegen.

Öffnen Sie config/routes.rb zur Bearbeitung mit nano oder Ihrem bevorzugten Editor:

  1. nano config/routes.rb

Die Datei sieht wie folgt aus:

~/sharkapp/config/routes.rb
Rails.application.routes.draw do
  resources :sharks
  # Weitere Details zur DSL, die in dieser Datei verfügbar ist, finden Sie unter http://guides.rubyonrails.org/routing.html
end

Ohne spezifischere Einstellungen wird die Standardansicht unter http://localhost:3000 oder http://your_server_ip:3000 die standardmäßige Rails-Willkommensseite sein.

Um die Root-Ansicht der Anwendung dem index-View des Sharks-Controllers zuzuordnen, müssen Sie die folgende Zeile zur Datei hinzufügen:

~/sharkapp/config/routes.rb
Rails.application.routes.draw do
  resources :sharks

  root 'sharks#index' 
  # Weitere Informationen zur verfügbaren DSL in dieser Datei finden Sie unter http://guides.rubyonrails.org/routing.html
end

Nun, wenn Benutzer zur Root Ihrer Anwendung navigieren, sehen sie eine vollständige Liste der Haie und haben die Möglichkeit, einen neuen Hai-Eintrag zu erstellen, bestehende Einträge zu betrachten und gegebene Einträge zu bearbeiten oder zu löschen.

Speichern Sie die Datei und beenden Sie Ihren Editor, wenn Sie mit der Bearbeitung fertig sind. Wenn Sie nano verwendet haben, um die Datei zu bearbeiten, können Sie dies tun, indem Sie STRG+X, Y und dann EINGABE drücken.

Sie können Ihre Migrationen jetzt mit dem folgenden Befehl ausführen:

  1. rails db:migrate

Sie sehen eine Ausgabe, die die Migration bestätigt.

Starten Sie Ihren Rails-Server erneut. Wenn Sie lokal arbeiten, geben Sie ein:

  1. rails s

Auf einem Entwicklungsserver geben Sie ein:

  1. rails s --binding=your_server_ip

Navigieren Sie zu localhost:3000, wenn Sie lokal arbeiten, oder zu http://your_server_ip:3000, wenn Sie auf einem Entwicklungsserver arbeiten.

Ihre Anwendungs-Startseite wird so aussehen:

Um einen neuen Hai zu erstellen, klicken Sie auf den Neuer Hai Link unten auf der Seite, der Sie zur sharks/new Route führt:

Fügen wir etwas Demoinformationen hinzu, um unsere Anwendung zu testen. Geben Sie „Weißer Hai“ in das Name Feld und „Furchteinflößend“ in das Fakten Feld ein:

Klicken Sie auf die Erstellen Schaltfläche, um den Hai zu erstellen.

Dies leitet Sie zur show-Route weiter, die, dank des before_action-Filters, mit der set_shark-Methode festgelegt wird, die die id des von uns gerade erstellten Sharks abruft:

~/sharkapp/app/controllers/sharks_controller.rb
class SharksController < ApplicationController
  before_action :set_shark, only: [:show, :edit, :update, :destroy]

  . . . 

  def show
  end

  . . . 

  private
    # Verwenden Sie Callbacks, um allgemeine Einrichtungen oder Bedingungen zwischen Aktionen zu teilen.
    def set_shark
      @shark = Shark.find(params[:id])
    end
  . . .

Sie können die Bearbeitungsfunktion jetzt testen, indem Sie auf Bearbeiten bei Ihrem Shark-Eintrag klicken. Dies bringt Sie zur edit-Route für diesen Shark:

Ändern Sie die Fakten über den Weißen Hai, um „Groß“ anstelle von „Furchteinflößend“ zu lesen, und klicken Sie auf Shark aktualisieren. Dies bringt Sie zurück zur show-Route:

Klicken Sie abschließend auf Zurück, um zu Ihrer aktualisierten index-Ansicht zu gelangen:

Nachdem Sie die grundlegende Funktionalität Ihrer Anwendung getestet haben, können Sie einige Validierungen und Sicherheitsüberprüfungen hinzufügen, um alles sicherer zu machen.

Schritt 5 — Validierungen hinzufügen

Ihre Shark-Anwendung kann Eingaben von Benutzern akzeptieren, aber stellen Sie sich einen Fall vor, in dem ein Benutzer versucht, einen Shark zu erstellen, ohne Fakten hinzuzufügen, oder einen Eintrag für einen Shark erstellt, der sich bereits in der Datenbank befindet. Sie können Mechanismen erstellen, um Daten zu überprüfen, bevor sie in die Datenbank eingegeben werden, indem Sie Validierungen zu Ihren Modellen hinzufügen. Da sich die Logik Ihrer Anwendung in ihren Modellen befindet, macht es mehr Sinn, die Dateneingabe hier zu validieren, als es an anderer Stelle in der Anwendung zu tun.

Beachten Sie, dass wir in diesem Tutorial nicht über die Schreibung von Validierungsprüfungen sprechen werden, aber Sie können mehr über Testing erfahren, indem Sie die Rails-Dokumentation consultieren.

Wenn Sie den Server noch nicht gestoppt haben, führen Sie dies nun durch, indem Sie CTRL+C eingeben.

Öffnen Sie Ihr shark.rb Modelldatei:

  1. nano app/models/shark.rb

Derzeit informiert die Datei uns, dass die Shark-Klasse von ApplicationRecord erbt, die wiederum von ActiveRecord::Base erbt:

~/sharkapp/app/models/shark.rb
class Shark < ApplicationRecord
end

Lassen Sie uns zunächst einige Validierungen für unser name Feld hinzufügen, um sicherzustellen, dass das Feld ausgefüllt ist und dass die Eingabe eindeutig ist, um Doppelteinträge zu vermeiden:

~/sharkapp/app/models/shark.rb
class Shark < ApplicationRecord
  validates :name, presence: true, uniqueness: true
end

Nächstes fügen Sie eine Validierung für das facts Feld hinzu, um sicherzustellen, dass es ebenfalls ausgefüllt ist:

~/sharkapp/app/models/shark.rb
class Shark < ApplicationRecord
  validates :name, presence: true, uniqueness: true
  validates :facts, presence: true
end

Wir interessieren uns hier nicht so sehr für die Eindeutigkeit der Fakten, solange sie mit eindeutigen Haifisch-Einträgen verknüpft sind.

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Starten Sie Ihren Server erneut mit entweder rails s oder rails s --binding=your_server_ip, je nachdem, ob Sie lokal arbeiten oder mit einem Entwicklungs-Server.

Navigieren Sie zu Ihrer Anwendungsschroot bei http://localhost:3000 oder http://your_server_ip:3000.

Klicken Sie auf Neuer Hai. Füllen Sie im Formular das Feld Name mit „Großer Weißer“ und das Feld Fakten mit „Große Zähne“ aus, und klicken Sie dann auf Hai erstellen. Sie sollten die folgende Warnung sehen:

Schauen wir uns nun an, ob wir unsere andere Validierung überprüfen können. Klicken Sie auf Zurück, um zur Startseite zurückzukehren, und dann erneut auf Neuer Hai. Geben Sie im neuen Formular „Tigerhai“ in das Feld Name ein und lassen Sie Fakten leer. Durch Klicken auf Hai erstellen wird die folgende Warnung ausgelöst:

Mit diesen Änderungen verfügt Ihre Anwendung über einige Validierungen, um die Konsistenz der in der Datenbank gespeicherten Daten sicherzustellen. Jetzt können Sie sich den Benutzern Ihrer Anwendung zuwenden und definieren, wer Anwendungsdaten ändern kann.

Schritt 6 — Authentifizierung hinzufügen

Mit Validierungen vor Ort haben wir einige Garantien für die in der Datenbank gespeicherten Daten. Aber wie sieht es mit Benutzern aus? Wenn wir nicht möchten, dass beliebige Benutzer zur Datenbank hinzufügen, dann sollten wir einige Authentifizierungsmaßnahmen ergreifen, um sicherzustellen, dass nur berechtigte Benutzer Haie hinzufügen können. Um dies zu erreichen, verwenden wir die http_basic_authenticate_with Methode, mit der wir eine Kombination aus Benutzername und Passwort erstellen können, um Benutzer zu authentifizieren.

Es gibt mehrere Möglichkeiten, Benutzer in Rails zu authentifizieren, einschließlich der Arbeit mit den bcrypt oder devise Gems. Im Moment werden wir jedoch eine Methode zu unserem Application Controller hinzufügen, die für Aktionen in unserer gesamten Anwendung gilt. Dies wird nützlich sein, wenn wir in der Zukunft weitere Controller zur Anwendung hinzufügen.

Stoppen Sie Ihren Server erneut mit STRG+C.

Öffnen Sie die Datei, die Ihren ApplicationController definiert:

  1. nano app/controllers/application_controller.rb

Darin sehen Sie die Definition der ApplicationController-Klasse, von der die anderen Controller in Ihrer Anwendung erben:

~/sharkapp/app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
end

Um Benutzer zu authentifizieren, verwenden wir eine fest kodierte Benutzernamen- und Passwortkombination mit der http_basic_authenticate_with-Methode. Fügen Sie den folgenden Code zur Datei hinzu:

~/sharkapp/app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  http_basic_authenticate_with name: 'sammy', password: 'shark', except: [:index, :show]
end

Neben der Angabe von Benutzername und Passwort hier haben wir auch die Authentifizierung eingeschränkt, indem wir die Routen angegeben haben, wo sie nicht erforderlich sein soll: index und show. Eine andere Möglichkeit, dies zu erreichen, wäre only: [:create, :update, :destroy] zu schreiben. Auf diese Weise können alle Benutzer alle Haie betrachten und Fakten über bestimmte Haie lesen. Bei der Änderung von Website-Inhalten müssen die Benutzer jedoch nachweisen, dass sie Zugang haben.

In einer robusteren Einrichtung möchten Sie Werte nicht auf diese Weise hartcodieren, aber zu Demonstrationszwecken ermöglicht Ihnen dies, zu sehen, wie Sie die Authentifizierung für die Routen Ihrer Anwendung einbinden können. Es zeigt Ihnen auch, wie Rails Sitzungsdaten standardmäßig in Cookies speichert: Sobald Sie sich bei einer bestimmten Aktion authentifiziert haben, müssen Sie in derselben Sitzung nicht erneut authentifiziert werden.

Speichern und schließen Sie app/controllers/application_controller.rb, wenn Sie mit der Bearbeitung fertig sind. Sie können die Authentifizierung jetzt in Aktion testen.

Starten Sie den Server entweder mit rails s oder rails s --binding=your_server_ip und navigieren Sie zu Ihrer Anwendung unter http://localhost:3000 oder http://your_server_ip:3000.

Klicken Sie auf der Startseite auf die Schaltfläche Neuer Shark. Dadurch wird das folgende Authentifizierungsfenster ausgelöst:

Wenn Sie die Kombination aus Benutzername und Passwort eingeben, die Sie zu app/controllers/application_controller.rb hinzugefügt haben, können Sie sicher einen neuen Shark erstellen.

Sie haben jetzt eine funktionierende Shark-Anwendung mit Datenvalidierungen und einem einfachen Authentifizierungsschema.

Schlussfolgerung

Die Rails-Anwendung, die Sie in diesem Tutorial erstellt haben, ist ein Ausgangspunkt, den Sie für die weitere Entwicklung nutzen können. Wenn Sie sich für die Erkundung des Rails-Ökosystems interessieren, ist die Projektdokumentation ein großartiger Startpunkt.

Sie können auch mehr darüber erfahren, wie Sie verschachtelte Ressourcen zu Ihrem Projekt hinzufügen, indem Sie How To Create Nested Resources for a Ruby on Rails Application lesen, das Ihnen zeigt, wie Sie die Modelle und Routen Ihrer Anwendung erstellen.

Darüber hinaus könnten Sie interessiert sein, wie Sie ein robusteres Frontend für Ihr Projekt mit einem Framework wie React einrichten. How To Set Up a Ruby on Rails Project with a React Frontend bietet Anleitungen dazu.

Um alternative Datenbankoptionen zu erkunden, können Sie auch How To Use PostgreSQL with Your Ruby on Rails Application on Ubuntu 18.04 überprüfen, die Ihnen zeigt, wie Sie mit PostgreSQL arbeiten statt mit SQLite. Sie können auch unsere Bibliothek von PostgreSQL-Tutorials ansehen, um mehr über die Arbeit mit dieser Datenbank zu lernen.

Source:
https://www.digitalocean.com/community/tutorials/how-to-build-a-ruby-on-rails-application