0

我在 activeadmin 资源控制器中有以下代码....

ActiveAdmin.register Customer do
  menu :parent => "Accounts", :label => proc{controller.get_label()}

  controller do
    def get_label
      current_user.hasrole?(:sysadmin) ? 'Customers' : 'Your Account'
    end

这行不通。我收到“未在 CustomersController 上定义的 get_label”错误。但是,正如您在上面看到的,我确实在控制器上定义了 get_label 函数。

任何人都知道如何设置这样的调用(基本上是根据当前用户角色动态确定用于客户菜单项的标签)?

4

1 回答 1

0

您用于 :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 可用

希望这可以帮助

于 2013-09-14T03:44:12.710 回答