Разработка в пространстве имен

Я пытаюсь разделить свой проект rails на интерфейс для обычных пользователей и бэкэнд для администраторов. Поэтому я создал пространство имен «admin», чтобы я мог легко управлять методами / макетами / аутентификацией контроллера, специфичными для администратора, в админке карты.

Я использую Devise только для регистрации / аутентификации своих администраторов. Поскольку он используется только для администраторов, я пытаюсь переместить Devise в пространство имен администратора.

Я не смог найти именно то, что искал, в документации Devise, но я попробовал что-то подобное в маршрутах .rb:

namespace 'admin'do 
  devise_for :admins
end

Я также пытался создать собственный контроллер Devise :: Sessions, но это тоже не сработало.

Кто-нибудь знает как это сделать? Должен ли я просто использовать обычные маршруты для разработки с настраиваемым (админским) макетом?


person Harm de Wit    schedule 21.12.2010    source источник


Ответы (6)


Просто «перемещать» Devise в пространство имён администратора неправильно. Devise использует контроллеры типа Devise::SessionsController, которые нельзя "переместить".

Обычно я создаю свои собственные контроллеры и наследую их от Devise:

class Admin::SessionsController < ::Devise::SessionsController
  layout "admin"
  # the rest is inherited, so it should work
end

И настройте это в config/routes.rb:

devise_for :admins, :controllers => { :sessions => "admin/sessions" }

Или вы можете изменить только макет, немного усложнив его:

class ApplicationController < ActionController::Base

  layout :layout

  private

  def layout
    if devise_controller? && devise_mapping.name == :admin
      "admin"
    else
      "application"
    end
  end

end
person iain    schedule 21.12.2010
comment
Большое спасибо за ваше понятное решение. Я учусь работать с пространствами имен, поэтому ваше первое решение действительно мне пригодится. - person Harm de Wit; 21.12.2010
comment
Нет необходимости наследовать каждый контроллер устройства, чтобы установить свой собственный макет. Вы можете сделать это в application.rb stackoverflow.com/a/11085724/1474934 - person Sano J; 11.03.2020

Как насчет того, чтобы просто переместить метод devise_for в область видимости:

scope '/admin' do
  devise_for :admins
end

С пространством имен контроллеры попытаются найти Admin::SessionController, которого не существует. Со прицелом это не так, так что это должно сработать.

person Jack Chu    schedule 30.03.2011
comment
Именно то, что мне было нужно, Ура! - person Michael De Silva; 15.04.2016
comment
Просто хочу добавить ссылку на документацию о различных способах добавления области в маршруты rails здесь - person Vic; 31.08.2019

Как насчет указания разработать путь, по которому нужно идти, поместите это за пределы вашего пространства имен.

devise_for :users, path: 'admins'

Это сгенерирует следующие маршруты

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

В этом случае ничего менять не нужно, если это то, что вы ищете.

Удачного кодирования :)

person Ronak Jain    schedule 14.01.2015

И Джек Чу, и Решения iain должны решить эту проблему, а также создать ваши представления для настройки макета формы входа.

Итак, в вашем config/routes.rb у вас должно быть

scope '/subfolder' do
   devise_for :admins, :controllers => { :sessions => "subfolder/sessions" }
end

namespace :subfolder do
  match '/', :to => 'subcontroller#action'
end

Помните, что вы можете создавать свои собственные контроллеры для сессий, как вы это уже делаете. Возможно, вам также нужно будет сгенерировать свои представления, используя rails generate devise:views

Проверьте это, чтобы не сомневаться в задачах разработки.

person Saldan    schedule 07.09.2012

Если вы хотите разместить свои представления разработки в views / admin / admins /, а ваши контроллеры - в controllers / admin / admins /:

ваш sessions_controller.rb в контроллерах / 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

Создание просмотров разработки:

rails g devise:views admin/admins
person Guabi Delabatte    schedule 13.08.2013

В дополнение к первому решению ответа iain мне пришлось сгенерировать представления devise, иначе он выдает исключение отсутствия шаблона.

генерировать просмотры с

rails g devise_views

Представления будут расположены в views> devise. Переместите созданную карту 'sessions' в представления карты> admin

person Harm de Wit    schedule 22.12.2010
comment
это на самом деле rails generate devise:views - person Calavera; 26.02.2012
comment
В старых версиях он был devise_views. :) - person Matt Huggins; 22.04.2012