Разделение макетов с аутентификацией и без аутентификации в 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,

Другие вопросы по тегам