0

我刚刚启动了一个新的 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 中的所有文件。

为未经身份验证的用户和登录用户定义一种布局的最佳方法是什么?

4

2 回答 2

1

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.slimunauthenticated_application.html.slim在布局文件夹中创建的。

参考:https ://github.com/plataformatec/devise/wiki/How-To:-Create-custom-layouts

于 2019-05-24T07:58:04.843 回答
0

正如文档所述:

您可以以声明方式指定布局(使用布局类方法)或将其命名为与您的控制器相同的名称,并将其放置在 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.

于 2019-05-23T09:34:40.500 回答