在Rails中如何为几个控制器跳过skip_before_action?

12

嗨,我正在为一个应用程序构建 API 部分。所有 API 相关的控制器都位于 app/controllers/api 目录中。

我的问题在于,在 application_controller 中有一个过滤器 before_action :authenticate_user!,所以我必须处于登录模式才能访问 API。

我的当前解决方案:在所有位于 app/controllers/api 目录中的控制器中添加 skip_before_action :authenticate_user!

问题:我必须在所有控制器中写入这个代码,并且我有大约80个控制器。

我的期望:是否有一种方式可以在 application_controller 中编写像这样的内容:before_action :authenticate_user!, except: [api目录中的所有控制器]


实现类似的功能。 - Nithin
2个回答

34
您将需要在每个控制器中指定skip_before_action :authenticate_user!,以便对不需要进行身份验证的操作进行身份验证。您不能将控制器名称或任何类似的内容作为参数传递给skip_before_action方法。
一种解决方案是:您可以创建一个名为APIController的控制器,并在其中指定skip_before_action,如下所示:
class APIController < ApplicationController
  skip_before_action :authenticate_user!
  # rest of the code
end

然后所有在 app/controllers/api/ 中的控制器都可以继承自 APIController

class OtherController < APIController
end

2
如果所有控制器都在 API 文件夹下,您可以尝试如下操作:
class ApplicationController < ActionController::Base
  before_action :authenticate!


  def authenticate!
    if params[:controller].split("/").first == "api"
      return true # or put code for what wherever authenticate you use for api  
    else
      authenticate_user!
    end
  end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接