before_action中的render / head不会停止执行其余的操作

时间:2018-08-18 05:04:52

标签: ruby-on-rails ruby-on-rails-4 before-filter

我有一个私有方法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

但是我仍然很困惑为什么原始方法不起作用。

1 个答案:

答案 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