skip_before_action for Rails中的一些控制器?

时间:2016-04-27 07:05:08

标签: ruby-on-rails

您好我正在为应用构建api部分。我的所有与api相关的控制器都位于app/controllers/api目录中。

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

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

问题:我必须写入所有控制器,我有大约80个控制器

我的期望:有没有办法我可以在application_controller写这样的东西 before_action:authenticate_user !,除了:[all the controllers which are in api directory]

2 个答案:

答案 0 :(得分:17)

您必须在每个应该对其操作进行身份验证的控制器中指定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

    ActivityOptionsCompat activityOptions = ActivityOptionsCompat.makeSceneTransitionAnimation(
            (Activity) context,
            new Pair<View, String>(view.findViewById(R.id.iv_content),
                    ArtDetailAdapter.VIEW_NAME_HEADER_IMAGE),
            new Pair<View, String>(view.findViewById(R.id.tv_art_name),
                    ArtDetailAdapter.VIEW_NAME_HEADER_IMAGE_NAME));

    ActivityCompat.startActivity((Activity) context, intent, activityOptions.toBundle());

答案 1 :(得分: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