Ruby on rails 调用控制器函数在ActiveAdmin中定义菜单
我在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.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