Ruby on rails render/head in before_操作不会停止执行其余操作
我有一个私人方法来验证你的用户!在我的应用程序控制器中,它验证标头中的令牌,并在找到时返回用户记录。这是它的样子Ruby on rails render/head in before_操作不会停止执行其余操作,ruby-on-rails,ruby-on-rails-4,before-filter,Ruby On Rails,Ruby On Rails 4,Before Filter,我有一个私人方法来验证你的用户!在我的应用程序控制器中,它验证标头中的令牌,并在找到时返回用户记录。这是它的样子 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 h
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
我使用此方法对控制器中的用户进行身份验证,如下所示
class AddressesController < ApplicationController
before_action :authenticate_user!
def some_action
data = @current_user.some_associated_records
render json: {data: data}
end
end
然而,我仍然感到困惑,为什么原来的方法不起作用 如前所述()500的错误发生在您试图从@current\u login
获取用户时的步骤上,该步骤为nil
head
方法只调用render nothing:true
和提供的状态。
而且render
不会中断任何执行链
根据以上注释,我建议将其改写如下:
def认证用户!
@当前登录=登录。查找方式(oauth2令牌:承载令牌)
@当前用户=@current\u登录名和.user
标题401如果@current_user.nil?
结束
500上的回溯是什么?我注意到“和返回”被注释掉了吗?另请参见当执行@current\u user=@current\u login.user
时,@current\u login与current\u login500之间的区别。基本上,当令牌错误或不存在时,@current_login为nil,并引发NoMethodError user for nil类。当前登录和@current\u登录之间没有区别。那是个打字错误。更正了。根据我的理解,任何在动作之前渲染或导入的方法都应该停止其余动作的执行。因此,不应要求“和返回”。即使我使用它,结果也是一样的。
private
def authenticate_user!(*)
@current_login = Login.where(oauth2_token: bearer_token).first!
@current_user = @current_login.user
rescue ActiveRecord::RecordNotFound
head 401
end