4

我有一个像这样的活动管理资源:

ActiveAdmin.register Snippet do

  menu label: "Text Snippets"

  config.clear_sidebar_sections!

  index download_links: false do
    column :key if current_admin_user.developer?
    column :description
    column :contents
    default_actions
  end

  form do |f|
    f.inputs do
      f.input :description
      f.input :contents
    end
    f.buttons
  end

end

请注意,在该块中,如果当前管理员用户是开发人员index,我只会添加该列。key我想将这种过滤应用于可用的操作。

我尝试在资源定义的顶部添加这个:

actions current_admin_user.developer ? :all : :index, :edit

但我得到了NameError一个current_admin_user。出于某种原因,在配置块之外,current_admin_user不存在活动的管理员助手。

那么,我该如何根据当前用户的权限来过滤操作呢?

4

1 回答 1

9

你必须使用一个过程...... current_admin_user 只在它运行的应用程序时工作,而不是在你声明你的类时......

例子..

action_item :only => [:edit], :if => proc { current_admin_user.developer? } do
  #enter code here
end

您也可以为此使用 CanCan.. 并将controller.authorize_resource其放在开头。检查 activeadmin 文档。

另一种方法是覆盖 ActiveAdmin 控制器中的 action_methods .. 像这样

actions :all

controller do
  def action_methods
    if current_admin_user.developer?
      super
    else
      super - ['show', 'destroy', 'new', 'create']
    end
  end
end

如果您有多个角色,这很有效。

顺便说一句,你应该使用developer?而不是developer(当然,如果developer我怀疑该方法返回一个布尔值)

更新

在 0.6+ 版本中,您应该坚持使用 CanCan,有关更多信息,请查看 activeadmin 文档http://www.activeadmin.info/docs/13-authorization-adapter.html#using_the_cancan_adapter

于 2012-07-31T17:18:52.943 回答