[RUBY] [Rails / Routing] So verweisen Sie auf den Controller in Ihrem eigenen Verzeichnis

Überblick

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.


Umgebung


Was ich diesmal machen möchte


Überprüfen Sie zunächst den Vorgang mit einem normalen Benutzercontroller

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 ...

demo


Die Ansicht wurde normal angezeigt!

Lass uns von hier anfangen!



Verschieben Sie den Controller in das Administratorverzeichnis

1. Was passiert, wenn ich in das Administratorverzeichnis wechsle?

demo

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.


2. Setzen Sie den Namespace auf Routing

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!

demo

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?


demo


Es war immer noch nutzlos. Es scheint, dass eine weitere Arbeit erforderlich ist. Geben wir unser Bestes!


3. Verschieben Sie die Ansichtsdatei

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?


demo


Erledigt! Das ist das Ziel!


Zusammenfassung

Hinweise zum Erstellen eines Verzeichnisses in App / Controllern und zum Platzieren von Controller-Dateien </ b>

  1. Legen Sie den Namespace für das Routing fest

  2. Ändern Sie den Klassennamen in Admin :: UsersController (Verzeichnisnamen hinzufügen).

  3. 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!

Referenz

Recommended Posts