我知道使用以下代码:
before_action :signed_in?, only: [:new]
该行动new将是否执行signed_in?返回true,而是如果我想的new时候要执行的动作signed_in?返回false,我必须做什么?例如,我是否必须创建一个名为的新方法not_signed_in??
这是我的signed_in?方法
def signed_in?
!@current_user.nil?
end
Run Code Online (Sandbox Code Playgroud) 我有一个私有方法authenticate_user!在我的应用程序控制器中,它验证标头中的令牌并返回用户记录(如果找到)。这是它的样子。
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
Run Code Online (Sandbox Code Playgroud)
我使用此方法对控制器中的用户进行身份验证,如下所示。
class AddressesController < ApplicationController
before_action :authenticate_user!
def some_action
data = @current_user.some_associated_records
render json: {data: data}
end
end
Run Code Online (Sandbox Code Playgroud)
理想情况下,当找不到登录名或找不到相应的用户时,我应该从authenticate_user 获得 401 响应!方法。
相反,我总是收到 500 内部服务器错误。不知何故,它head 401 if current_login.nil?不会停止执行链。即使渲染状态:401 也不起作用。
根据我的理解,如果 Rails在 before_action 过滤器中找到 arender或 a命令,则它会返回。head我缺少什么?
编辑:
以下解决方案有效:
private
def authenticate_user!(*)
@current_login = Login.where(oauth2_token: bearer_token).first!
@current_user = @current_login.user
rescue ActiveRecord::RecordNotFound
head …Run Code Online (Sandbox Code Playgroud)