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