[RUBY] [Rails / Routing] Comment faire référence au contrôleur dans votre propre répertoire

Aperçu

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.


environnement


Ce que je veux faire cette fois


Tout d'abord, vérifiez le fonctionnement avec un contrôleur d'utilisateurs ordinaire

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

demo


La vue était affichée normalement!

Commençons d'ici!



Déplacer le contrôleur vers le répertoire admin

1. Que faire si je passe au répertoire admin?

demo

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.


2. Définissez l'espace de noms sur le routage

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'!

demo

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?


demo


C'était toujours inutile. Il semble qu'un autre travail soit nécessaire. Faisons de notre mieux!


3. Déplacer le fichier de vue

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?


demo


L'a fait! Tel est le but!


Sommaire

Remarques sur la création d'un répertoire dans app / controllers et le placement des fichiers de contrôleur </ b>

  1. Définissez l'espace de noms pour le routage

  2. Changez le nom de la classe en quelque chose comme Admin :: UsersController (ajoutez le nom du répertoire)

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

référence

Recommended Posts