Разработать в пространстве имен
Я пытаюсь разделить мой проект рельсов в интерфейсе для обычных пользователей и back-end для админов. Поэтому я создал пространство имен "admin", чтобы я мог легко контролировать определенные контроллером методы/макеты/аутентификацию администратора в admin.
Я использую Devise для регистрации/проверки подлинности только моих администраторов. Поскольку он используется только для администраторов, я пытаюсь переместить Devise в пространство имен admin.
Я не смог найти то, что искал в документации в Devise, но я пробовал что-то вроде этого в routes.rb:
namespace 'admin'do
devise_for :admins
end
Я также попытался создать настраиваемый контроллер Devise:: Sessions, но это тоже не сработало.
Кто-нибудь знает, как это сделать? Должен ли я просто использовать обычные маршруты для разработки с помощью пользовательского (административного) макета?
Ответы
Ответ 1
Просто "перемещение". Представление в пространство имен admin неверно. В 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
Ответ 2
Как просто перемещать метод devise_for
в область видимости:
scope '/admin' do
devise_for :admins
end
С пространством имен контроллеры попытаются найти Admin::SessionController
, который не существует. С областью действия это не так, поэтому это должно работать.
Ответ 3
Как насчет того, чтобы указать путь к пути, разместите это вне своего пространства имен.
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
Вам не нужно ничего менять в этом случае, если это то, что вы ищете.
Счастливое кодирование:)
Ответ 4
Обе версии Jack Chu и 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
Проверьте это на наличие каких-либо сомнений при разработке задач.
Ответ 5
В дополнение к первому решению ответа iain я должен был генерировать представления для разработки, иначе он выдает исключение шаблона.
генерировать представления с помощью
rails g devise_views
Представления будут отображаться в представлениях > devise. Переместить созданные сеансы карты на виды карты > admin
Ответ 6
Если вы хотите поместить свои представления в представления/admin/admins/и ваши контроллеры в контроллеры /admin/admins/:
your 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