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

时间:2019-05-23 09:25:33

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

我刚刚启动了一个新的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中的所有文件,无论用户是否登录。

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

2 个答案:

答案 0 :(得分:1)

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之外,我还在layouts文件夹中创建了unauthenticated_application.html.slim

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

答案 1 :(得分:0)

作为docs状态:

  

您可以声明性地指定布局(使用layout类方法),也可以为其指定与控制器相同的名称,然后将其放置在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