Ruby on Rails - Controller
Der Rails-Controller ist das logische Zentrum Ihrer Anwendung. Es koordiniert die Interaktion zwischen dem Benutzer, den Ansichten und dem Modell. Der Controller beherbergt auch eine Reihe wichtiger Nebendienstleistungen.
Es ist für die Weiterleitung externer Anforderungen an interne Aktionen verantwortlich. Es handhabt menschenfreundliche URLs sehr gut.
Es verwaltet das Caching, wodurch die Leistung der Anwendungen um Größenordnungen gesteigert werden kann.
Es verwaltet Hilfsmodule, die die Funktionen der Ansichtsvorlagen erweitern, ohne den Code zu vergrößern.
Es verwaltet Sitzungen und vermittelt den Benutzern den Eindruck einer kontinuierlichen Interaktion mit unseren Anwendungen.
Der Prozess zum Erstellen eines Controllers ist sehr einfach und ähnelt dem Prozess, den wir bereits zum Erstellen eines Modells verwendet haben. Wir werden hier nur einen Controller erstellen -
library\> rails generate controller Book
Beachten Sie, dass Sie Book groß schreiben und die Singularform verwenden. Dies ist ein Rails-Paradigma, dem Sie bei jeder Erstellung eines Controllers folgen sollten.
Dieser Befehl führt mehrere Aufgaben aus, von denen die folgenden hier relevant sind:
Es wird eine Datei mit dem Namen erstellt app/controllers/book_controller.rb
Wenn Sie sich book_controller.rb ansehen, finden Sie es wie folgt:
class BookController < ApplicationController
end
Controller-Klassen erben von ApplicationController, der anderen Datei im Controller-Ordner:application.rb.
Der ApplicationController enthält Code, der auf allen Ihren Controllern ausgeführt werden kann, und erbt von der Rails ActionController :: Base- Klasse.
Sie müssen sich noch nicht um den ApplicationController kümmern , also definieren wir einfach ein paar Methodenstubs inbook_controller.rb. Je nach Ihren Anforderungen können Sie in dieser Datei eine beliebige Anzahl von Funktionen definieren.
Ändern Sie die Datei wie folgt und speichern Sie Ihre Änderungen. Beachten Sie, dass es an Ihnen liegt, welchen Namen Sie diesen Methoden geben möchten, aber besser, relevante Namen zu vergeben.
class BookController < ApplicationController
def list
end
def show
end
def new
end
def create
end
def edit
end
def update
end
def delete
end
end
Lassen Sie uns nun alle Methoden einzeln implementieren.
Implementieren der Listenmethode
Mit der Listenmethode erhalten Sie eine Liste aller Bücher in der Datenbank. Diese Funktionalität wird durch die folgenden Codezeilen erreicht. Bearbeiten Sie die folgenden Zeilen in der Datei book_controller.rb.
def list
@books = Book.all
end
Die Zeile @books = Book.all in der Listenmethode weist Rails an, die Büchertabelle zu durchsuchen und jede gefundene Zeile im @ books-Instanzobjekt zu speichern.
Implementierung der Show-Methode
Die Show-Methode zeigt nur weitere Details zu einem einzelnen Buch an. Diese Funktionalität wird durch die folgenden Codezeilen erreicht.
def show
@book = Book.find(params[:id])
end
Die Zeile @book = Book.find (params [: id]) der show-Methode weist Rails an, nur das Buch zu finden, dessen ID in params [: id] definiert ist.
Das params-Objekt ist ein Container, mit dem Sie Werte zwischen Methodenaufrufen übergeben können. Wenn Sie sich beispielsweise auf der von der Listenmethode aufgerufenen Seite befinden, können Sie auf einen Link für ein bestimmtes Buch klicken und die ID dieses Buches über das params-Objekt übergeben, damit show das bestimmte Buch finden kann.
Implementierung der neuen Methode
Die neue Methode teilt Rails mit, dass Sie ein neues Objekt erstellen. Fügen Sie dieser Methode einfach den folgenden Code hinzu.
def new
@book = Book.new
@subjects = Subject.all
end
Die obige Methode wird aufgerufen, wenn Sie dem Benutzer eine Seite zur Benutzereingabe anzeigen. In der zweiten Zeile werden alle Themen aus der Datenbank abgerufen und in ein Array mit dem Namen @subjects eingefügt.
Implementierung der Erstellungsmethode
Sobald Sie Benutzereingaben mithilfe des HTML-Formulars vorgenommen haben, ist es Zeit, einen Datensatz in der Datenbank zu erstellen. Um dies zu erreichen, bearbeiten Sie die Methode create in der Datei book_controller.rb so, dass sie mit den folgenden übereinstimmt:
def create
@book = Book.new(book_params)
if @book.save
redirect_to :action => 'list'
else
@subjects = Subject.all
render :action => 'new'
end
end
def book_params
params.require(:books).permit(:title, :price, :subject_id, :description)
end
In der ersten Zeile wird eine neue Instanzvariable mit dem Namen @book erstellt, die ein Book-Objekt enthält, das aus den vom Benutzer übermittelten Daten erstellt wurde. Dasbook_params Methode wird verwendet, um alle Felder vom Objekt zu sammeln :books. Die Daten wurden von der neuen Methode übergeben, um sie mit dem params-Objekt zu erstellen.
Die nächste Zeile ist eine bedingte Anweisung, die den Benutzer an weiterleitet listMethode, wenn das Objekt korrekt in der Datenbank gespeichert wird. Wenn es nicht gespeichert wird, wird der Benutzer zur neuen Methode zurückgeschickt. Die Methode redirect_to ähnelt der Durchführung einer Metaaktualisierung auf einer Webseite: Sie leitet Sie automatisch ohne Benutzerinteraktion an Ihr Ziel weiter.
Dann ist @subjects = Subject.all erforderlich, falls die Daten nicht erfolgreich gespeichert werden und der Fall ähnlich wird wie bei der neuen Option.
Implementieren der Bearbeitungsmethode
Die Bearbeitungsmethode sieht fast identisch mit der Show-Methode aus. Beide Methoden werden verwendet, um ein einzelnes Objekt anhand seiner ID abzurufen und auf einer Seite anzuzeigen. Der einzige Unterschied besteht darin, dass die Show-Methode nicht bearbeitet werden kann.
def edit
@book = Book.find(params[:id])
@subjects = Subject.all
end
Diese Methode wird aufgerufen, um Daten auf dem Bildschirm anzuzeigen, die vom Benutzer geändert werden sollen. In der zweiten Zeile werden alle Themen aus der Datenbank abgerufen und in einem Array namens @subjects abgelegt.
Implementieren der Aktualisierungsmethode
Diese Methode wird nach der Bearbeitungsmethode aufgerufen, wenn der Benutzer Daten ändert und die Änderungen in der Datenbank aktualisieren möchte. Die Aktualisierungsmethode ähnelt der Erstellungsmethode und wird zum Aktualisieren vorhandener Bücher in der Datenbank verwendet.
def update
@book = Book.find(params[:id])
if @book.update_attributes(book_param)
redirect_to :action => 'show', :id => @book
else
@subjects = Subject.all
render :action => 'edit'
end
end
def book_param
params.require(:book).permit(:title, :price, :subject_id, :description)
end
Die update_attributes-Methode ähnelt der von create verwendeten Speichermethode, überschreibt jedoch nicht die Attribute einer vorhandenen Zeile, sondern überschreibt die Attribute der vorhandenen Zeile.
Dann ist die Zeile @subjects = Subject.all erforderlich, falls die Daten nicht erfolgreich gespeichert werden, und ähnelt dann der Bearbeitungsoption.
Implementierung der Löschmethode
Wenn Sie einen Datensatz aus der Datenbank löschen möchten, verwenden Sie diese Methode. Implementieren Sie diese Methode wie folgt.
def delete
Book.find(params[:id]).destroy
redirect_to :action => 'list'
end
In der ersten Zeile wird die Klassifizierung anhand des über das params-Objekt übergebenen Parameters ermittelt und anschließend mit der Methode destroy gelöscht. Die zweite Zeile leitet den Benutzer mithilfe eines redirect_to-Aufrufs zur Listenmethode weiter.
Zusätzliche Methoden zum Anzeigen von Motiven
Angenommen, Sie möchten Ihren Benutzern die Möglichkeit geben, alle Bücher zu einem bestimmten Thema zu durchsuchen. Sie können also in book_controller.rb eine Methode erstellen, um alle Themen anzuzeigen. Angenommen, der Methodenname lautetshow_subjects - -
def show_subjects
@subject = Subject.find(params[:id])
end
Endlich dein book_controller.rb Datei wird wie folgt aussehen -
class BooksController < ApplicationController
def list
@books = Book.all
end
def show
@book = Book.find(params[:id])
end
def new
@book = Book.new
@subjects = Subject.all
end
def book_params
params.require(:books).permit(:title, :price, :subject_id, :description)
end
def create
@book = Book.new(book_params)
if @book.save
redirect_to :action => 'list'
else
@subjects = Subject.all
render :action => 'new'
end
end
def edit
@book = Book.find(params[:id])
@subjects = Subject.all
end
def book_param
params.require(:book).permit(:title, :price, :subject_id, :description)
end
def update
@book = Book.find(params[:id])
if @book.update_attributes(book_param)
redirect_to :action => 'show', :id => @book
else
@subjects = Subject.all
render :action => 'edit'
end
end
def delete
Book.find(params[:id]).destroy
redirect_to :action => 'list'
end
def show_subjects
@subject = Subject.find(params[:id])
end
end
Speichern Sie nun Ihre Controller-Datei.
Was kommt als nächstes?
Sie haben fast alle Methoden erstellt, die im Backend funktionieren. Als nächstes definieren wir Routen (URLs) für Aktionen.