调用控制器函数以在ActiveAdmin中定义菜单

时间:2013-09-13 20:31:05

标签: ruby-on-rails activeadmin

我在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函数,如上所示。

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

1 个答案:

答案 0 :(得分:0)

您正在使用的proc:将在视图的上下文中评估label。要访问其控制器,您可以调用self.controller这就是您正在做的事情。问题是

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

会影响所有生成的ActiveAdmin控制器的视图(因为该菜单是ActiveAdmin中存在于任何地方的导航)。例如,如果您调出信息中心,controller将是Admin::DashboardController的实例(但get_label已在您生成的Admin::CustomerController中定义,因此您会收到错误消息。你有几个明智的选择。

1)将get_label放入帮助程序,如application_helper,然后执行`proc {get_label}

2)将get_label放在ApplicationController中。在这种情况下,您对menu的调用不会更改。

你可以做一些其他的事情来使这个更好,但他们主要是只是上述两个选项的变体。

为什么ApplicationController(app/controllers/application_controller.rb)中的方法可用于我的ActiveAdmin控制器?

事实证明,当ActiveAdmin生成控制器时,它具有以下继承结构:

  Admin::DashboardController # generated from app/admin/dashboard.rb
    extends ActiveAdmin::PageController 
      extends ActiveAdmin::BaseController 
        extends InheritedResources::Base 
          extends ApplicationController # application_controller.rb

因此,Application :: DashboardController

可以使用ApplicationController下定义的实例方法

希望这有帮助