1

到目前为止,这种组合设置中的大部分内容都运行良好。但是,当我尝试有条件地禁用过滤器时,它们总是被启用。我的场景是(或多或少)我想给Restaurant所有者(AdminUser具有角色的 s :restaurateur)部分访问权限:他们只能编辑自己的餐厅,我也想对他们隐藏一些字段。这行得通。但禁用过滤器不会。让我详细说明:

# app/admin/restaurants.rb
batch_action :activate, :if => proc { can? :activate, Restaurant } do |list|
  #...
end
controller do
  def current_ability
    @current_ability ||= Ability.new(current_admin_user)
  end
end
index do
  ...
  column :city if can? :manage, Restaurant             # This works well.
end
filter :city, :if => proc { can? :manage, Restaurant } # This is always there.

Ability: _

# app/models/ability.rb
if user.has_role? :admin
  can :manage, :all
elsif user.has_role? :restaurateur
  cannot :manage, Restaurant

这是我在 Rails 控制台中看到的内容:

 admin = AdminUser.find(1)                           # roles => [:admin]
 restorateur = AdminUser.find(2)                     # roles => [:restaurateur]
 Ability.new(admin).can?(:manage, Restaurant)        # true
 Ability.new(restorateur).can?(:manage, Restaurant)  # false

我知道我并没有以最好的方式使用它,比如使用:manage在常见情况下不打算提供部分访问的动词。但它可以工作,除了禁用过滤器。

有什么特别的我应该做的,所以这些确实有效吗?

Rolify 位于3.2.0. CanCan 在1.6.8. ActiveAdmin 处于此 GIT 修订版:b0dd8fdcfbd68984a8c2ec7f2279a121eeb66c3d. 如果我将它更新到最新的 GIT 版本(或官方 0.5.0 版本),batch_actions 总是被禁用!(因此他们也禁用了selectable_column。)

关于我的问题:

是否有任何可靠的方法来测试 ActiveAdmin 文件中的能力?也许实例化能力的方式给他们提供了错误的用户(我的意思是在检查过滤器:ifProc 之前)?can?在这种情况下,助手如何获得实例化的能力,我几乎不知道。

如果我的方式不正确,有条件地禁用过滤器的推荐方式是什么?

任何人都知道为什么 ActiveAdmin 的最新版本似乎完全忽略了批处理操作?也许我应该把积木放在controller do积木之前batch_action

谢谢你的时间。

4

1 回答 1

6

我遇到了同样的问题,并在这个问题中找到了解决方案。

应用此猴子补丁后:

# config/initializers/activeadmin_filter_conditions.rb
module ActiveAdmin
  module Filters
    class FormBuilder < ::ActiveAdmin::FormBuilder
      def filter(method, options = {})
        return "" if method.blank?
        if options[:if].is_a?(Proc)
          return "" if !template.instance_eval(&options[:if])
        end
        options[:as] ||= default_input_type(method)
        return "" unless options[:as]
        content = input(method, options)
        form_buffers.last << content.html_safe if content
      end
    end
  end
end

您应该能够使用您提到的方式在过滤器中使用条件:

filter :city, :if => proc { can? :manage, Restaurant }
于 2012-09-17T10:34:57.007 回答