gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:37:26 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com