J'essaie de diviser mon Rails projet dans un front-end pour les utilisateurs réguliers et un back-end pour les administrateurs. Par conséquent, j'ai créé un espace de noms 'admin' afin que je puisse facilement contrôler admin méthodes/dispositions/authentification spécifiques du contrôleur dans l'administrateur de la carte.
J'utilise Devise pour enregistrer/authentifier mes administrateurs uniquement. Parce qu'il n'est utilisé que pour les administrateurs, j'essaie de déplacer Devise vers l'espace de noms administrateur.
Je n'ai pas pu trouver exactement ce que je cherchais dans le documentation de Devise mais j'ai essayé quelque chose comme ça dans routes.rb:
namespace 'admin'do
devise_for :admins
end
J'ai également essayé de créer un contrôleur Devise :: Sessions personnalisé, mais cela ne semblait pas fonctionner non plus.
Est-ce que quelqu'un sait comment faire ça? Dois-je simplement utiliser les itinéraires réguliers pour concevoir avec une mise en page (admin) personnalisée?
Simplement "déplacer" Devise vers l'espace de noms administrateur est faux. Devise utilise des contrôleurs comme Devise::SessionsController
et qui ne peut pas être "déplacé".
Je crée généralement mes propres contrôleurs et les hérite de Devise:
class Admin::SessionsController < ::Devise::SessionsController
layout "admin"
# the rest is inherited, so it should work
end
Et configurez cela dans config/routes.rb
:
devise_for :admins, :controllers => { :sessions => "admin/sessions" }
O vous pouvez changer la mise en page uniquement, en rendant la mise en page un peu plus complexe:
class ApplicationController < ActionController::Base
layout :layout
private
def layout
if devise_controller? && devise_mapping.name == :admin
"admin"
else
"application"
end
end
end
Que diriez-vous de simplement déplacer le devise_for
méthode dans une portée:
scope '/admin' do
devise_for :admins
end
Avec l'espace de noms, les contrôleurs essaieront de rechercher un Admin::SessionController
qui n'existera pas. Avec la portée, ce n'est pas le cas, donc cela devrait fonctionner.
Que diriez-vous de spécifier le chemin à suivre, placez-le en dehors de votre espace de noms.
devise_for :users, path: 'admins'
Cela générera les itinéraires suivants
new_user_session GET /admins/sign_in(.:format) devise/sessions#new
user_session POST /admins/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /admins/sign_out(.:format) devise/sessions#destroy
user_password POST /admins/password(.:format) passwords#create
new_user_password GET /admins/password/new(.:format) passwords#new
edit_user_password GET /admins/password/edit(.:format) passwords#edit
PUT /admins/password(.:format) passwords#update
cancel_user_registration GET /admins/cancel(.:format) registrations#cancel
user_registration POST /admins(.:format) registrations#create
new_user_registration GET /admins/sign_up(.:format) registrations#new
edit_user_registration GET /admins/edit(.:format) registrations#edit
PUT /admins(.:format) registrations#updat
DELETE /admins(.:format) registrations#destroy
Vous n'avez rien à changer dans ce cas, si c'est ce que vous recherchez.
Happy Coding :)
Les solutions Jack Ch et iain devraient résoudre le problème et générer vos vues afin de personnaliser la mise en page du formulaire de connexion.
Donc, dans votre config/routes.rb
tu aurais dû
scope '/subfolder' do
devise_for :admins, :controllers => { :sessions => "subfolder/sessions" }
end
namespace :subfolder do
match '/', :to => 'subcontroller#action'
end
N'oubliez pas de créer vos propres contrôleurs pour les sessions comme vous le faites déjà. Vous devrez probablement générer vos vues également en utilisant Rails generate devise:views
Cochez cette case pour tout doute sur les tâches de conception.
Si vous voulez mettre vos vues de devise dans vues/admin/admins/et vos contrôleurs dans controllers/admin/admins /:
votre sessions_controller.rb dans controllers/admin/admins:
class Admin::Admins::SessionsController < ::Devise::SessionsController
layout "admin/connection"
end
routes.rb:
namespace :admin do |admin|
devise_for :admins, :controllers => { :sessions => "admin/admins/sessions" }
end
Générer des vues de devise:
Rails g devise:views admin/admins
En plus de la première solution de la réponse de iain, j'ai dû générer des vues de devise ou bien il lance une exception de modèle manquant.
générer des vues avec
Rails g devise_views
Les vues seront situées dans vues> concevoir. Déplacer les "sessions" de carte créées vers les vues de carte> admin