我没有模特的控制器。在此控制器中,我们正在加载一些其他资源。最重要的是,该应用程序具有多租户功能。
以下是代码:
# ability.rb
class Ability
include CanCan::Ability
def initialize(user)
if user.owner?
can :manage, Tool, tenant_id: user.tenant.id
end
end
end
# boxes_controller.rb
class BoxesController < ApplicationController
authorize_resource class: false
def index
tools = Tool.all
end
end
说,user1
tenant1
创建tool1
,user2
tenant2
创建tool2
。
问题是,tenant1
,user1
可以访问tool2
! :(
我写错了吗?请帮忙。
答案 0 :(得分:0)
试试这个
if user.owner?
can :manage, Tool do |tools|
tools.tenant_id == user.tenant.id
end
end
并在控制器中
authorize_resource class: false
希望有所帮助!
答案 1 :(得分:0)
我的习惯是“不要完全阅读宝石的文档”。我在这里找到了解决方案:https://github.com/ryanb/cancan/wiki/Fetching-Records
# ability.rb
class Ability
include CanCan::Ability
def initialize(user)
if user.owner?
can :manage, Tool, tenant_id: user.tenant.id
end
end
end
# boxes_controller.rb
class BoxesController < ApplicationController
authorize_resource class: false
before_action :set_tool, only: %i(edit update destroy)
def index
tools = Tool.accessible_by(current_ability)
end
private
def set_tool
@tool = Tool.find params[:id]
authorize! :manage, @tool
end
end
也许这对某人有帮助。谢谢!