我在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函数,如上所示。
任何人都知道如何设置这样的调用(基本上是根据当前用户角色动态确定用于客户菜单项的标签)?
答案 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下定义的实例方法希望这有帮助