Ruby on rails 调用控制器函数在ActiveAdmin中定义菜单

Ruby on rails 调用控制器函数在ActiveAdmin中定义菜单,ruby-on-rails,activeadmin,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 这不管

我在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
这不管用。我收到“get_标签未在CustomerController上定义”错误。但是,正如您在上面看到的,我在控制器上定义了get_label函数


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

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

menu :parent => "Accounts", :label => proc{controller.get_label()}
影响所有生成的ActiveAdmin控制器上的视图(因为菜单是ActiveAdmin中无处不在的导航)。例如,如果您打开仪表板,
controller
将是
Admin::DashboardController
的一个实例(但是
get\u label
是在您生成的
Admin::CustomerController
中定义的,因此您会得到一个错误)。你有几个明智的选择

1) 将
get\u label
放入一个助手中,就像应用程序\u helper一样,然后执行'proc{get\u label}

2) 在ApplicationController中放置
get\u标签。在这种情况下,对
菜单的调用不会更改

你可以做很多其他的事情来让它变得更好,但它们大多只是上面两个选项的变体

为什么我的ActiveAdmin控制器可以使用ApplicationController(
app/controllers/application\u controller.rb
)中的方法?

事实证明,当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


希望这有帮助

你可以把你的功能放在其他地方,比如你的客户模型,然后有
菜单:parent=>“Accounts”,:label=>proc{Customer.get_label()}
@aruanoc如果你这样做,那么你至少需要将
当前_用户
传递给
get_label
。不确定为什么要投反对票。对我来说似乎是个合理的问题。我只是希望能够根据登录的用户更改菜单文本。问题似乎是AA在资源的控制器完全构建之前呈现菜单,因此在构建菜单时,添加到控制器的任何方法都不可用。将get_label()函数放在其他任何地方都意味着当前_用户(用于确定菜单标签应该是什么)将不可用。总之,目前看来这是不可能的。我不确定你说的应用程序控制器是什么意思。一旦进入activeadmin空间,主应用程序控制器就不会被点击。你一定是指某个ActiveAdmin应用程序控制器,但到目前为止我还没有找到。有什么想法吗?@drventure顺便问一下,你使用的是什么版本的ActiveAdmin和Rails?ActiveAdmin 0.5.1 Rails 3.2.13非常奇怪。我在我的应用程序控制器中添加了一个函数,但仍然没有定义函数。我要再试一次,但要重新启动所有程序。我以为我有,但可能没有。感谢你能试试activeadmin 0.6.0吗?可能执行
捆绑更新activeadmin