ruby - ActiveAdmin、CanCan、Rolify - 无法有条件地禁用过滤器

标签 ruby ruby-on-rails-3 activeadmin

到目前为止,这个组合设置中的大部分内容都运行良好。但是,当我尝试有条件地禁用过滤器时,它们总是处于启用状态。我的情况是(或多或少)我想给 Restaurant 所有者(AdminUser 角色 :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.

能力:

# 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_action 总是被禁用! (因此他们也禁用了 selectable_column。)

关于我的问题:

有没有可靠的方法来测试 ActiveAdmin 文件中的能力?也许能力被实例化的方式给了他们错误的用户(我的意思是在检查过滤器 :if Proc 之前)?在这种情况下,can? 助手如何获得实例化的 Ability,我有点不知所措。

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

有人知道为什么 ActiveAdmin 的最新版本似乎完全忽略批处理操作吗?也许我应该将 controller do block 放在 batch_action block 之前?

感谢您的宝贵时间。

最佳答案

我遇到了同样的问题,并在此 issue 中找到了解决方案.

应用这个 monkeypatch 之后:

# 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 }

关于ruby - ActiveAdmin、CanCan、Rolify - 无法有条件地禁用过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12387838/

相关文章:

ruby-on-rails - 是否有 Ruby gems 的版本管理器?

sql - Heroku - 每个月的第一天更新数据库列

Ruby-on-Rails:ActiveAdmin 父类(super class)不匹配类型错误

ruby - 这个 ruby​​ 函数如何返回任何东西?

ruby-on-rails - 与 Thinking Sphinx 的深度关联和 Sphinx 索引?

使用 MySQL 5.6 在 CentOS 6.4 x64 上安装 mysql2 gem 失败

ruby - 在一个类和它的某个祖先之间定义的实例方法

ruby-on-rails-3 - Rails 3 - form_for 复数化在 "new"操作上导致路径/方法错误,但在 "edit"上没有

ruby-on-rails - Active Admin 中的自定义表单

ruby-on-rails - Ransack + FlagShihTzu + Active Admin 不能很好地协同工作