当用户进入我们网站的根目录或注销时,Devise 身份验证第一次显示“您需要先登录或注册才能继续”。页面重新加载后,此消息消失。
我们网站的根目录设置为具有以下功能的控制器:
before_filter :authenticate_user!
我们需要这个控制器作为根。如何消除此消息?
当用户进入我们网站的根目录或注销时,Devise 身份验证第一次显示“您需要先登录或注册才能继续”。页面重新加载后,此消息消失。
我们网站的根目录设置为具有以下功能的控制器:
before_filter :authenticate_user!
我们需要这个控制器作为根。如何消除此消息?
正确的解决方案是按照官方 wiki 中的说明设置经过身份验证的块:https ://github.com/plataformatec/devise/wiki/How-To:-Require-authentication-for-all-pages
authenticated :user do
root to: 'home#index', as: :authenticated_root
end
root to: redirect('/users/sign_in')
范围authenticated
块只有在登录后才会被调用,因此您可以愉快地将用户引导到您选择的控制器。在示例中,它会在未经身份验证时将它们重定向到登录页面,但这可能是您路由中的任何操作。
我没有找到比定义更好的解决方案
unauthenticated: ''
在 /config/locales/devise.en.yml 文件中。
您想摆脱仅索引上的消息吗?如果是这样,您可以执行以下操作:
before_filter :authenticate_user!, :except => [:index]
您也可以将其他操作添加到数组中。
请注意,这不会调用authenticate_user!
指定的操作,因此请确保用户不需要为给定的操作进行身份验证!
假设您已经封装了您的设计错误消息,如下所示。
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
您可以将以下 CSS 代码添加到根控制器的索引视图文件中。
<style type="text/css">
.notice, .alert { visibility: hidden; }
</style>
这应该隐藏您网站根目录的错误消息。
在所有页面(登录、注册等除外)都受到保护的情况下before_action :authenticate_user!
,我会这样覆盖 Devise SessionController
:
app/controllers/sessions_controller.rb
class SessionsController < Devise::SessionsController
def new
if flash[:alert] == unauthenticated_message
flash.delete(:alert) unless requested_protected_page?
end
super
end
private
def requested_protected_page?
session[:user_return_to] != root_path
end
def unauthenticated_message
I18n.t('devise.failure.unauthenticated')
end
end
然后告诉你的config/routes.rb
文件使用那个被覆盖的控制器:
devise_for :users, controllers: {
sessions: :sessions,
}
您可以在控制器中创建一个单独的操作,只是为了解决用户是否登录,然后重定向到所需的位置。
class WelcomeController < ApplicationController
skip_before_filter :authenticate_user!, only: :root
def index
end
def root
flash.keep
redirect_to current_user ? welcome_index_path : new_user_session_path
end
end
这应该可以工作,当然你应该在你的 ApplicationController
before_filer: authenticate_user!
并在路由根配置为welcome#root