如何定义与cancancan的多态关联能力?

时间:2018-11-27 09:20:49

标签: ruby-on-rails ruby cancancan

我在定义多个多态关联的功能时遇到问题。这是我的模特:

class Document < ApplicationRecord
  belongs_to :resource, polymorphic: true, optional: true
end

class Section < ApplicationRecord
  has_many :documents, as: :resource, dependent: :destroy
end

class Cabinet < ApplicationRecord
  has_many :documents, as: :resource, dependent: :destroy
end

我的documents_controller.rb中的下一个内容:

class DocumentsController < ApplicationController
  load_resource :section
  load_resource :cabinet
  load_and_authorize_resource :document, through: [:section, :cabinet], shallow: true
end

在我的ability.rb中,我有:

def viewer(users_role)
  allowed_cabinet_ids = [2,5]
  allowed_section_ids = [1,3,4]

  can [:read, :create], Document, resource_id: allowed_cabinet_ids, resource_type: 'Cabinet'
  can [:read, :create], Document, resource_id: allowed_section_ids, resource_type: 'Section'
end

当我尝试转到new操作以创建“文档用于节”时,会出现问题。路径为localhost:3000/sections/1/documents/new

当我尝试转到此页面时,出现403错误。我在@document动作中调试了new,发现cancancanresource一样设置#<Document id: nil, name: nil, resource_type: 'Cabinet', resource_id: 1>,这是不正确的,应该有resource_type: 'Section'

问题取决于已定义能力的位置,因为当我交换它们时,问题localhost:3000/cabinets/:id/documents/new出现了。

我的问题是我该如何定义具有不同类型和ID的多态关联的能力,并确保它们在位置上融合在一起?

0 个答案:

没有答案