使用 Devise 在 Rails 中划分已验证和未验证的布局

Dividing authenticated and unauthenticated layouts in Rails with Devise

我刚刚启动了一个新的 Rails (6.0.0.rc1) 应用程序并包含了用于身份验证的设计。现在,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

虽然这对我来说似乎是一个 hack,也因为它包括 %head 中的所有文件,无论用户是否登录。

为未授权用户定义一种布局和为登录用户定义一种布局的最佳方式是什么?

作为 docs 状态:

You can either specify a layout declaratively (using the layout class method) or give it the same name as your controller, and place it in app/views/layouts. If a subclass does not have a layout specified, it inherits its layout using normal Ruby inheritance.

For instance, if you have PostsController and a template named app/views/layouts/posts.html.erb, that template will be used for all actions in PostsController and controllers inheriting from PostsController.

If you use a module, for instance Weblog::PostsController, you will need a template named app/views/layouts/weblog/posts.html.erb.

因此,您只需将自定义布局定义为 app/views/layouts/devise/sessions.html.erb

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