Разработать в пространстве имен - PullRequest
37 голосов
/ 21 декабря 2010

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

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

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

namespace 'admin'do 
  devise_for :admins
end

Я также пытался создать собственный контроллер Devise :: Sessions, но это тоже, похоже, не сработало.сделать это?Должен ли я просто использовать обычные маршруты для разработки с пользовательским (администратором) макетом?

Ответы [ 6 ]

38 голосов
/ 21 декабря 2010

Простое «перемещение» 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
21 голосов
/ 30 марта 2011

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

scope '/admin' do
  devise_for :admins
end

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

11 голосов
/ 14 января 2015

Как насчет указания пути, по которому следует идти, разместите его вне своего пространства имен.

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

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

Happy Coding:)

5 голосов
/ 07 сентября 2012

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

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

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

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

Проверьте это , если есть сомнения по поводу заданий для разработки.

1 голос
/ 13 августа 2013

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

your session_controller.rb в controllers / admin / admins:

class Admin::Admins::SessionsController < ::Devise::SessionsController
  layout "admin/connection"
end

rout.rb:

namespace :admin do |admin|
    devise_for :admins, :controllers => { :sessions => "admin/admins/sessions" }
end

Создание представлений устройства:

rails g devise:views admin/admins
0 голосов
/ 22 декабря 2010

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

генерирует представления с

rails g devise_views

Представлениябудет находиться в представлениях> разработать.Переместить созданные сеансы карты в представления карты> admin

...