Active Admin的before_filter应用于给定的命名空间

时间:2015-10-01 14:49:51

标签: ruby-on-rails activeadmin

我的主应用程序位于名称空间 / namespace1 下,并且引擎位于 / myengine 下。两者都在使用Active Admin引擎。

我想确保在允许人们进入/ myengine名称空间之前执行before_filter。

我试了一下:

https://viget.com/extend/8-insanely-useful-activeadmin-customizations

此解决方案不起作用,因为它扩展了BaseController,从而导致/ myengine中的此限制泄漏并影响主应用程序的命名空间/ namespace1

如果我在所有管理控制器中复制代码,它会起作用,但是,嘿,代码重复很糟糕,我们都知道!

if defined?(ActiveAdmin)
      # https://github.com/activeadmin/activeadmin/wiki/Define-a-resource-inside-an-engine

      ActiveAdmin.register MyResource, namespace: :myengine do
          before_filter :myfilter

          def myfilter
               # if user is not allowed within /myengine
               # kick his a** back to /namespace1 with a message saying he's not allowed in !
          end
end

我只是看一个干净利落的方式告诉ActiveAdmin“请将此过滤器用于给定的引擎名称空间,不要将其应用于主应用程序的名称空间”!我确定有:)

我尝试在我的引擎的Active Admin初始化程序中使用config.before_filter,但这是相同的旧故事,这适用于AA的全局设置,影响我的主应用程序的命名空间而不仅仅是引擎......

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

通过在AA初始化程序中使用它来解决这个问题:

config.before_filter :namespace1_filter, 
  if: proc{ request.path.split("/")[1] == "namespace1" }

config.before_filter :namespace2_filter, 
  if: proc{ request.path.split("/")[1] == "namespace2" }

希望有更好的方法来获得当前的AA命名空间。无法立即找到它。

答案 1 :(得分:0)

在ActiveAdmin控制器中,可以访问配置 包括ActiveAdmin::Namespace对象。访问命名空间是 通过#active_admin_config方法完成。然后过滤器可以作用于 价值Namespace#name

ActiveAdmin.register MyResource do

  before_filter :authorize_access_to_myengine

  controller do

    private

    def authorize_access_to_myengine
      if active_admin_namespace.name == :myengine
        # check user's authorization
      end
    end

    def active_admin_namespace
      active_admin_config.namespace
    end
  end
end