web-dev-qa-db-fra.com

Concevoir dans l'espace de noms

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?

38
Harm de Wit

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
41
iain

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.

25
Jack Chu

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 :)

14
Ronak Jain

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.

5
Saldan

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
1
Guabi Delabatte

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

0
Harm de Wit