Разделение макетов с аутентификацией и без аутентификации в Rails с Devise
Я только что запустил новое приложение Rails (6.0.0.rc1) и включил Devise для аутентификации. Теперь у Devise есть много просмотров, которые используются для регистрации, входа и так далее. Естественно, я хочу предоставить неаутентифицированным пользователям доступ к этим представлениям, в то время как основное приложение полностью доступно только для аутентифицированных пользователей. В настоящее время я делаю следующее в моем routes.rb
:
devise_scope :user do
authenticated :user do
root 'pages#home', as: :authenticated_root
end
unauthenticated do
root 'devise/sessions#new', as: :unauthenticated_root
end
end
Тогда по моему application.haml
У меня есть простое утверждение if / else:
!!!
%html
%head
...
%body
- if user_signed_in?
= render 'some/template'
= yield
- else
= yield
Это кажется мне хаком, так как он включает в себя все файлы в%head независимо от того, вошел ли пользователь в систему или нет.
Как лучше всего определить один тип макета для неаутентифицированных пользователей и один для авторизованных пользователей?
2 ответа
routes.rb
выглядит хорошо для меня.
Чтобы указать приложению использовать разные макеты для разных контроллеров devise в зависимости от статуса аутентификации пользователя, у меня это есть в моем application.rb
:
# application.rb
module MyApp
class Application < Rails::Application
config.to_prepare do
Devise::SessionsController.layout 'unauthenticated_application'
Devise::RegistrationsController.layout proc { |_controller| user_signed_in? ? 'application' : 'unauthenticated_application' }
Devise::ConfirmationsController.layout 'unauthenticated_application'
Devise::UnlocksController.layout 'unauthenticated_application'
Devise::PasswordsController.layout 'unauthenticated_application'
Devise::InvitationsController.layout proc { |_controller| user_signed_in? ? 'application' : 'unauthenticated_application' }
end
end
end
Итак, в дополнение к application.html.slim
Я создал unauthenticated_application.html.slim
в папке раскладок.
Ссылка: https://github.com/plataformatec/devise/wiki/How-To:-Create-custom-layouts
Как утверждают документы:
Вы можете либо указать макет декларативно (используя метод класса макета), либо присвоить ему то же имя, что и у вашего контроллера, и поместить его в app/views/layouts. Если у подкласса не указан макет, он наследует свой макет, используя обычное наследование Ruby.
Например, если у вас есть PostsController и шаблон с именем app/views/layouts/posts.html.erb, этот шаблон будет использоваться для всех действий в PostsController и контроллеров, унаследованных от PostsController.
Если вы используете модуль, например Weblog::PostsController, вам понадобится шаблон с именем app / views / layouts / weblog/posts.html.erb.
Итак, вам просто нужно определить свой пользовательский макет как app/views/layouts/devise/sessions.html.erb
,