Um Easy Login (Test User Login) zu implementieren, habe ich auf ungewöhnliche Weise eine Controller-Datei erstellt.
Zu dieser Zeit hatte ich das Gefühl "Was ist damit los?", Also werde ich es aufnehmen.
macOS Catalina 10.15.6
ruby 2.6.5
Rails 6.0.3.4
MySQL : 5.6.47
[URL] Zugriff auf localhost: 3000 / admin / users
Route zur Indexaktion in app / controller / admin / users_controller.rb
Index.html.erb anzeigen
Geben Sie den folgenden Befehl in das Terminal ein.
% rails _6.0.0_ new controller-app -d mysql
% cd controller-app
% rails db:migrate
% rails g controller users
Stellen Sie das Routing außerdem wie folgt ein.
app/config/routes.rb
Rails.application.routes.draw do
resources :users, only: :index
end
HTTP Verb | URI Pattern | Controller#Action |
---|---|---|
GET | /users | users#index |
Fügen Sie dann die Indexaktion zum Controller hinzu.
app/controllers/users_controller.rb
class UsersController < ApplicationController
def index
end
end
Fügen Sie zum Schluss eine Ansicht hinzu.
erb:app/views/index.html.erb
<h1>users#index</h1>
Jetzt bist du bereit. Wenn ich versuche, auf '/ users' zuzugreifen ...
Die Ansicht wurde normal angezeigt!
Lass uns von hier anfangen!
Erstellen Sie das Verzeichnis app / controller / admin
Port users_controller.rb darin
Versuchen Sie, auf '/ users' zuzugreifen.
Ich erhalte einen Routing-Fehler mit der Meldung "Nicht initialisierte Konstante UsersController". Dies ist ein " Fehler ohne definierte Konstanten oder Klassen </ b>".
Um die aktuelle Situation zusammenzufassen
Fordern Sie GET '/ users' an
Benutzer # Index finden (Benutzer-Controller)
Es gibt keine solche Sache! Error
Hmm? Schauen wir uns noch einmal den Controller des Benutzers an.
app/controllers/admin/users_controller.rb
class UsersController < ApplicationController
def index
end
end
Sie schreiben Klasse UsersController! Ich möchte sagen, dass dies einfach ein Fehler in der Beschreibung ist.
Was bedeutet das ...
Suchen Sie mit der aktuellen Routing-Definition nach der Controller-Datei direkt im Verzeichnis app / controller </ b>.
Sie müssen den Routing-Verweis auf direkt im Verzeichnis app / controller / admin </ b> ändern
Wie erreichen Sie das? Dies wird unten erklärt.
Ich habe in diesem Rails-Handbuch auf 2.6 verwiesen.
Wenn Sie auf die Controller im Verzeichnis app / controller / admin verweisen möchten, konfigurieren Sie das Routing wie folgt:
app/config/routes.rb
Rails.application.routes.draw do
namespace :admin do
resources :users, only: :index
end
end
HTTP Verb | URI Pattern | Controller#Action |
---|---|---|
GET | /admin/users | admin/users#index |
Sie können jetzt den Benutzer-Controller im Administratorverzeichnis durchsuchen.
Lassen Sie uns nun tatsächlich auf "admin / users" zugreifen!
Ist es nicht gut ... Lassen Sie uns die Fehleranweisung vorerst entschlüsseln.
expected file /Users/***/app/controllers/admin/users_controller.rb to define constant Admin::UsersController, but didn't
Um die Konstante Admin :: UsersController zu definieren
Erfordert eine Datei mit dem Namen /Users/***/admin/users_controller.rb
Aber ich habe es nicht definiert
Derzeit befindet sich admin / users_controller.rb
im angegebenen Pfad.
Es scheint also gut, Admin :: UsersController zu definieren, der hier im Klassennamen </ b> angezeigt wird.
Ändern Sie also den Controller wie folgt.
app/controllers/admin/users_controller.rb
class Admin::UsersController < ApplicationController
def index
end
end
Wie wäre es damit?
Es war immer noch nutzlos. Es scheint, dass eine weitere Arbeit erforderlich ist. Geben wir unser Bestes!
Entschlüsseln Sie nun die vorherige Fehleranweisung.
Admin::UsersController#index is missing a template for request formats
Der Admin :: UsersController # -Index enthält keine Vorlage für das Anforderungsformat
Was ist das Anforderungsformat? Ich dachte, aber in den folgenden kleinen Buchstaben gab es einen Hinweis.
Unless told otherwise, Rails expects an action to render a template with the same name, contained in a folder named after its controller.
Sofern nicht anders angegeben, erwartet Rails eine Aktion, mit der eine Vorlage mit demselben Namen gerendert wird.
In einem Ordner enthalten, der nach dem Controller benannt ist
Mit anderen Worten, " Admin :: UsersController hat keine Ansicht zum Rendern </ b>". Und es scheint, dass die Datei in dem Verzeichnis abgelegt werden muss, das dem Controller-Namen entspricht.
Konkreter denken
Die Indexaktion von UsersController lautet
Rendern Sie Ansichten in app / views / users / index.html.erb
Daher in diesem Fall
Da es sich um die Indexaktion von Admin :: UsersController handelt
app/views/admin/users/index.html.erb
Es wird davon ausgegangen, dass Sie die Ansichtsdatei in festlegen sollten.
Deshalb werde ich es ändern!
erb:app/views/admin/users/index.html.erb
<h1>admin/users/index.html.erb</h1>
Wie wäre es jetzt?
Erledigt! Das ist das Ziel!
Hinweise zum Erstellen eines Verzeichnisses in App / Controllern und zum Platzieren von Controller-Dateien </ b>
Legen Sie den Namespace für das Routing fest
Ändern Sie den Klassennamen in Admin :: UsersController (Verzeichnisnamen hinzufügen).
Platzieren Sie die Ansichtsdatei direkt unter dem gleichnamigen Verzeichnis
Dies kann erreicht werden.
Die URL hat sich übrigens in diesem Fall geändert. Wenn Sie anstelle des Namespace ein Modul festlegen, bleibt die URL unverändert.
app/config/routes.rb
Rails.application.routes.draw do
scope module: :admin do
resources :users, only: :index
end
end
HTTP Verb | URI Pattern | Controller#Action |
---|---|---|
GET | /users | admin/users#index |
Ich habe viel gelernt! Wir werden weiterhin stetig etwas über Rails lernen!
Recommended Posts