我的主应用程序位于名称空间 / 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的全局设置,影响我的主应用程序的命名空间而不仅仅是引擎......
感谢您的帮助!
答案 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