Pour implémenter Easy Login (Test User Login), j'ai créé un fichier de contrôleur d'une manière inhabituelle.
A ce moment-là, j'avais le sentiment "Qu'est-ce qui se passe avec ça?", Donc je vais l'enregistrer.
macOS Catalina 10.15.6
ruby 2.6.5
Rails 6.0.3.4
MySQL : 5.6.47
[URL] Accéder à localhost: 3000 / admin / users
Route vers l'action d'indexation dans app / controllers / admin / users_controller.rb
Afficher index.html.erb
Entrez la commande suivante dans le terminal.
% rails _6.0.0_ new controller-app -d mysql
% cd controller-app
% rails db:migrate
% rails g controller users
Définissez également le routage comme suit.
app/config/routes.rb
Rails.application.routes.draw do
resources :users, only: :index
end
HTTP Verb | URI Pattern | Controller#Action |
---|---|---|
GET | /users | users#index |
Ajoutez ensuite l'action d'index au contrôleur.
app/controllers/users_controller.rb
class UsersController < ApplicationController
def index
end
end
Enfin, ajoutez une vue.
erb:app/views/index.html.erb
<h1>users#index</h1>
Vous êtes maintenant prêt. Quand j'essaye d'accéder à '/ users' ...
La vue était affichée normalement!
Commençons d'ici!
Créer un répertoire app / controllers / admin
Portez users_controller.rb dedans
Essayez d'accéder à '/ users'
J'obtiens une erreur de routage disant «UsersController constant non initialisé». Il s'agit d'une "erreur sans constantes ni classes définies </ b>".
Pour résumer la situation actuelle
Demander GET '/ users'
Trouver les utilisateurs # index (contrôleur d'utilisateurs)
Il n'y a pas une telle chose! Erreur
Hmm? Regardons à nouveau le contrôleur des utilisateurs.
app/controllers/admin/users_controller.rb
class UsersController < ApplicationController
def index
end
end
Vous écrivez la classe UsersController! Je voudrais dire que c'est simplement une erreur dans la description.
Qu'est-ce que ça veut dire ...
Avec la définition de routage actuelle, recherchez le fichier du contrôleur directement sous le répertoire app / controllers </ b>.
Vous devez changer la référence de routage en directement sous le répertoire app / controllers / admin </ b>
Alors, comment y parvenir? Ceci est expliqué ci-dessous.
J'ai fait référence à 2.6 dans ce guide Rails.
Si vous souhaitez référencer les contrôleurs dans le répertoire app / controllers / admin, configurez le routage comme suit:
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 |
Vous pouvez maintenant parcourir le contrôleur des utilisateurs dans le répertoire admin.
Maintenant, accédons réellement à 'admin / users'!
N'est-ce pas bon ... Décrypterons la déclaration d'erreur pour le moment.
expected file /Users/***/app/controllers/admin/users_controller.rb to define constant Admin::UsersController, but didn't
Pour définir la constante Admin :: UsersController
Nécessite un fichier appelé /Users/***/admin/users_controller.rb
Mais je ne l'ai pas défini
Actuellement, `ʻadmin / users_controller.rb`` se trouve dans le chemin spécifié. Donc il semble bon de définir Admin :: UsersController qui apparaît ici dans le nom de la classe </ b>.
Changez donc le contrôleur comme suit.
app/controllers/admin/users_controller.rb
class Admin::UsersController < ApplicationController
def index
end
end
Que dis-tu de ça?
C'était toujours inutile. Il semble qu'un autre travail soit nécessaire. Faisons de notre mieux!
Maintenant, déchiffrez la déclaration d'erreur précédente.
Admin::UsersController#index is missing a template for request formats
Admin :: UsersController # index n'a pas de modèle pour le format de requête
Quel est le format de la demande? J'ai pensé, mais il y avait un indice dans les petites lettres qui ont suivi.
Unless told otherwise, Rails expects an action to render a template with the same name, contained in a folder named after its controller.
Sauf indication contraire, Rails attend une action qui restitue un modèle avec le même nom.
Inclus dans un dossier nommé d'après le contrôleur
En d'autres termes, " Admin :: UsersController n'a pas de vue à rendre </ b>". Et il semble que le fichier doit être placé dans le répertoire correspondant au nom du contrôleur.
Penser un peu plus concrètement
L'action d'index de UsersController est
Rendu des vues dans app / views / users / index.html.erb
Par conséquent, dans ce cas,
Parce que c'est l'action d'index d'Admin :: UsersController
app/views/admin/users/index.html.erb
On pense que vous devez définir le fichier de vue dans.
C'est pourquoi je vais le changer!
erb:app/views/admin/users/index.html.erb
<h1>admin/users/index.html.erb</h1>
Et maintenant?
L'a fait! Tel est le but!
Remarques sur la création d'un répertoire dans app / controllers et le placement des fichiers de contrôleur </ b>
Définissez l'espace de noms pour le routage
Changez le nom de la classe en quelque chose comme Admin :: UsersController (ajoutez le nom du répertoire)
Placez le fichier de vue directement sous le répertoire du même nom
Ceci peut être réalisé.
Au fait, l'URL a changé dans ce cas. Si vous définissez le module au lieu de l'espace de noms, l'URL restera la même.
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 |
J'ai beaucoup appris! Nous continuerons à en apprendre davantage sur les rails!
Recommended Posts