【问题标题】:Dividing authenticated and unauthenticated layouts in Rails with Devise使用 Devise 在 Rails 中划分经过身份验证和未经身份验证的布局
【发布时间】:2019-05-23 09:25:33
【问题描述】:

我刚刚启动了一个新的 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

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

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

【问题讨论】:

    标签: ruby-on-rails ruby devise ruby-on-rails-6


    【解决方案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.slim,我还在布局文件夹中创建了unauthenticated_application.html.slim

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

    【讨论】:

    • 非常感谢。正是我想要的!
    【解决方案2】:

    作为docs 状态:

    您可以以声明方式指定布局(使用布局类方法)或将其命名为与您的控制器相同的名称,并将其放置在 app/views/layouts.xml 中。如果子类没有指定布局,它会使用普通的 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 2020-08-02
      • 2020-08-25
      相关资源
      最近更新 更多