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