您用于 :label 的过程将在视图的上下文中进行评估。为了访问它的控制器,你可以调用self.controller
你正在做的事情。问题是
menu :parent => "Accounts", :label => proc{controller.get_label()}
影响所有生成的 ActiveAdmin 控制器上的视图(因为菜单是 ActiveAdmin 中无处不在的导航)。例如,如果你拉起仪表板,controller
将是一个实例Admin::DashboardController
(但get_label
在你的 generated 中定义Admin::CustomerController
,所以你会得到一个错误)。你有几个明智的选择。
1)放入get_label
一个助手,如 application_helper 然后执行 `proc { get_label }
2)放入get_label
ApplicationController。在这种情况下,您的呼叫menu
不会改变。
你可以做很多其他的事情来让它变得更好,但它们大多只是上面两个选项的变体。
为什么app/controllers/application_controller.rb
我的 ActiveAdmin 控制器可以使用 ApplicationController ( ) 中的方法?
事实证明,当 ActiveAdmin 生成您的控制器时,它具有以下继承结构:
Admin::DashboardController # generated from app/admin/dashboard.rb
extends ActiveAdmin::PageController
extends ActiveAdmin::BaseController
extends InheritedResources::Base
extends ApplicationController # application_controller.rb
因此,在 ApplicationController 下定义的实例方法将对 Admin::DashboardController 可用
希望这可以帮助