我刚刚启动了一个新的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中的所有文件,无论用户是否登录。
为未经身份验证的用户定义一种布局,为登录的用户定义一种布局的最佳方法是什么?
答案 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
。