您用于 :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_labelApplicationController。在这种情况下,您的呼叫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 可用
希望这可以帮助