Разделение макетов с аутентификацией и без аутентификации в Rails с Devise - PullRequest
0 голосов
/ 23 мая 2019

Я только что запустил новое приложение 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 ]

1 голос
/ 24 мая 2019

Для меня routes.rb выглядит прекрасно.

Чтобы указать приложению использовать разные макеты для разных контроллеров устройств на основе статуса аутентификации пользователя, у меня это есть в моем 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

0 голосов
/ 23 мая 2019

В качестве состояния docs :

Вы можете либо декларативно указать макет (используя метод класса макета), либо присвоить ему то же имя, что и ваш контроллер, и поместить егов приложении / просмотры / макеты.Если для подкласса не указан макет, он наследует свой макет с использованием обычного наследования 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...