我在定义多个多态关联的功能时遇到问题。这是我的模特:
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
,发现cancancan
像resource
一样设置#<Document id: nil, name: nil, resource_type: 'Cabinet', resource_id: 1>
,这是不正确的,应该有resource_type: 'Section'
问题取决于已定义能力的位置,因为当我交换它们时,问题localhost:3000/cabinets/:id/documents/new
出现了。
我的问题是我该如何定义具有不同类型和ID的多态关联的能力,并确保它们在位置上融合在一起?