相关疑难解决方法(0)

如果before_action返回false,如何执行操作

我知道使用以下代码:

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)

ruby-on-rails callback actioncontroller

13
推荐指数
2
解决办法
2万
查看次数

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

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

ruby-on-rails before-filter ruby-on-rails-4

5
推荐指数
1
解决办法
3379
查看次数