我有一个私有方法authenticate_user!在我的应用程序控制器中,它验证标题中的令牌并返回用户记录(如果找到)。这是它的样子。
onProgressUpdate
我使用这种方法在控制器中对用户进行身份验证,如下所示。
def authenticate_user!
# authenticate
@current_login = Login.where(oauth2_token: bearer_token).first
head 401 if @current_login.nil? # and return
@current_user = @current_login.user
head 401 if @current_user.nil?
end
理想情况下,当找不到登录名或找不到对应的用户时,我应该从authenticate_user收到401响应!方法。
相反,我总是收到500个内部服务器错误。 class AddressesController < ApplicationController
before_action :authenticate_user!
def some_action
data = @current_user.some_associated_records
render json: {data: data}
end
end
不会以某种方式终止执行链。甚至渲染状态:401也不起作用。
据我了解,rails在before_action过滤器中找到head 401 if current_login.nil?
或render
命令时返回。我想念的是什么?
编辑:
以下解决方案有效:
head
但是我仍然很困惑为什么原始方法不起作用。
答案 0 :(得分:0)
如@Rahul所述(render/head in before_action does not stop executing the rest of the action),当您尝试从user
处的@current_login
获取nil
时,在步骤上发生500错误。此步骤。
head
方法仅以提供的状态调用render nothing: true
。
而且render
不会中断任何执行链。
根据上述说明,我建议将其重写为:
def authenticate_user!
@current_login = Login.find_by(oauth2_token: bearer_token)
@current_user = @current_login&.user
head 401 if @current_user.nil?
end